0Pricing
Kotlin Academy · Lekcja

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 operator i konwencjonalną nazwą (plus, minus, times itd.).
  • 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

  1. Funkcje operatorowe
  2. Operatory porównania
  3. Indeksowanie i invoke
  4. Najlepsze praktyki
← Powrót do Kotlin Academy