Funkcje operatorowe
Przeciążaj plus, minus i inne operatory
Funkcje operatorowe to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Na czym polega przeciążanie operatorów?
Przeciążanie operatorów pozwala typom reagować na symbole takie jak + lub -. Należy zdefiniować funkcję z modyfikatorem operator i specjalną nazwą.
data class Point(val x: Int, val y: Int) {
operator fun plus(o: Point) = Point(x + o.x, y + o.y)
}
fun main() {
println(Point(1, 2) + Point(3, 4))
}Słowo kluczowe operator
Modyfikator operator informuje kompilator, że dana funkcja obsługuje operator. Bez niego wyrażenie a + b nie działałoby.
data class Money(val amount: Int) {
operator fun plus(o: Money) = Money(amount + o.amount)
}
fun main() {
println(Money(5) + Money(3))
}Konwencjonalne nazwy
Każdemu operatorowi odpowiada ustalona nazwa funkcji: plus dla +, minus dla -, times dla *, div dla / i rem dla %.
data class Vec(val n: Int) {
operator fun times(k: Int) = Vec(n * k)
}
fun main() {
println(Vec(4) * 3)
}Minus i mnożenie
W tym samym typie można zdefiniować kilka operatorów.
data class Point(val x: Int, val y: Int) {
operator fun minus(o: Point) = Point(x - o.x, y - o.y)
operator fun times(k: Int) = Point(x * k, y * k)
}
fun main() {
println(Point(5, 5) - Point(1, 2))
println(Point(2, 3) * 2)
}Operatory jednoargumentowe
Jednoargumentowy minus obsługuje unaryMinus, jednoargumentowy plus obsługuje unaryPlus, a operator ! jest obsługiwany przez not.
data class Temp(val c: Int) {
operator fun unaryMinus() = Temp(-c)
}
fun main() {
println(-Temp(10))
}Zwiększanie i zmniejszanie
inc obsługuje ++, a dec obsługuje --. Zwracają one nową wartość tego samego typu.
data class Counter(val n: Int) {
operator fun inc() = Counter(n + 1)
}
fun main() {
var c = Counter(0)
c++
println(c.n)
}Przypisanie złożone
plusAssign obsługuje += dla zmiennych, których wartość można zmieniać. Jeśli istnieje tylko plus, operator += zamiast tego przypisuje nową wartość zmiennej.
class Bag {
val items = mutableListOf<String>()
operator fun plusAssign(item: String) { items.add(item) }
}
fun main() {
val bag = Bag()
bag += "apple"
println(bag.items)
}Operatory dla różnych typów
Typ parametru nie musi być zgodny z typem receivera. W tym przykładzie skalowanie punktu przez Int zwraca punkt.
data class Size(val w: Int, val h: Int) {
operator fun times(factor: Int) = Size(w * factor, h * factor)
}
fun main() {
println(Size(2, 3) * 4)
}Jako funkcje rozszerzające
Operatory można definiować jako funkcje rozszerzające, nawet dla typów, których nie jest się właścicielem.
data class Point(val x: Int, val y: Int)
operator fun Point.plus(o: Point) = Point(x + o.x, y + o.y)
fun main() {
println(Point(1, 1) + Point(2, 2))
}Łączenie operatorów
Przeciążone operatory można łączyć tak jak wbudowane, z zachowaniem zwykłych zasad kolejności wykonywania.
data class N(val v: Int) {
operator fun plus(o: N) = N(v + o.v)
operator fun times(o: N) = N(v * o.v)
}
fun main() {
val r = N(2) + N(3) * N(4)
println(r.v)
}Typy zwracane są dowolne
Operator może zwracać dowolny typ, ale zwracanie tego samego typu ułatwia intuicyjne użycie i łączenie wywołań.
data class Vec(val x: Int, val y: Int) {
operator fun plus(o: Vec) = Vec(x + o.x, y + o.y)
}
fun main() {
println(Vec(1, 2) + Vec(3, 4))
}Szybkie sprawdzenie
Proszę sprawdzić swoją znajomość funkcji operatorów.
Podsumowanie
W tej części poznali Państwo funkcje operatorów:
- Funkcje oznacza się słowem
operatori konwencjonalną nazwą (plus,minus,timesitd.). - Obsługiwane są operatory jednoargumentowe, zwiększania i zmniejszania oraz przypisania złożonego.
- Operatory mogą być elementami klasy lub funkcjami rozszerzającymi.
- Zwracanie tego samego typu ułatwia intuicyjne łączenie wywołań.
data class P(val x: Int) {
operator fun plus(o: P) = P(x + o.x)
}
fun main() {
println((P(2) + P(3)).x)
}Często zadawane pytania
Czy lekcja „Funkcje operatorowe” jest bezpłatna?
Tak — pełny tekst „Funkcje operatorowe” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Funkcje operatorowe”?
Przeciążaj plus, minus i inne operatory Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?
Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Funkcje operatorowe”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?
Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Funkcje operatorowe
- Operatory porównania
- Indeksowanie i invoke
- Najlepsze praktyki