0Pricing
Kotlin Academy · Lezione

Funzioni operator

Sovraccarichi plus, minus e così via

Funzioni operator è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Kotlin Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Kotlin Academy include 4 lezioni in totale.

Che cos’è l’overloading degli operatori?

L’overloading degli operatori consente ai propri tipi di rispondere a simboli come + o -. Si definisce una funzione con il modificatore operator e un nome speciale.

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))
}

La parola chiave operator

Il modificatore operator indica al compilatore che questa funzione implementa un operatore. Senza di esso, la chiamata a + b non funzionerebbe.

data class Money(val amount: Int) {
    operator fun plus(o: Money) = Money(amount + o.amount)
}

fun main() {
    println(Money(5) + Money(3))
}

Nomi convenzionali

Ogni operatore corrisponde a un nome di funzione fisso: plus per +, minus per -, times per *, div per /, rem per %.

data class Vec(val n: Int) {
    operator fun times(k: Int) = Vec(n * k)
}

fun main() {
    println(Vec(4) * 3)
}

Minus e times

È possibile definire diversi operatori sullo stesso tipo.

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)
}

Operatori unari

Il meno unario utilizza unaryMinus; il più unario utilizza unaryPlus; not implementa l’operatore !.

data class Temp(val c: Int) {
    operator fun unaryMinus() = Temp(-c)
}

fun main() {
    println(-Temp(10))
}

Incremento e decremento

inc implementa ++ e dec implementa --. Restituiscono un nuovo valore dello stesso tipo.

data class Counter(val n: Int) {
    operator fun inc() = Counter(n + 1)
}

fun main() {
    var c = Counter(0)
    c++
    println(c.n)
}

Assegnazione composta

plusAssign implementa += per i ricevitori mutabili. Se esiste solo plus, += riassegna invece la variabile.

class Bag {
    val items = mutableListOf<String>()
    operator fun plusAssign(item: String) { items.add(item) }
}

fun main() {
    val bag = Bag()
    bag += "apple"
    println(bag.items)
}

Operatori con tipi diversi

Il tipo del parametro non deve necessariamente corrispondere a quello del ricevitore. In questo caso, la scalatura di un punto tramite un Int restituisce un punto.

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)
}

Come funzioni di estensione

Gli operatori possono essere definiti come estensioni, anche per tipi che non appartengono al codice sviluppato.

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))
}

Concatenazione degli operatori

Gli operatori sottoposti a overloading si combinano come quelli incorporati, rispettando la normale precedenza.

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)
}

I tipi restituiti sono liberi

Un operatore può restituire qualsiasi tipo, ma restituire lo stesso tipo rende l’utilizzo intuitivo e concatenabile.

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))
}

Verifica rapida

Verifichi la sua comprensione delle funzioni operatore.

Riepilogo

Ha imparato a conoscere le funzioni operatore:

  • Contrassegni le funzioni con operator e un nome convenzionale (plus, minus, times, ...).
  • Sono supportati gli operatori unari, di incremento e di assegnazione composta.
  • Gli operatori possono essere membri o estensioni.
  • Restituire lo stesso tipo rende intuitiva la concatenazione.
data class P(val x: Int) {
    operator fun plus(o: P) = P(x + o.x)
}

fun main() {
    println((P(2) + P(3)).x)
}

Domande Frequenti

La lezione «Funzioni operator» è gratuita?

Sì — il testo completo di «Funzioni operator» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Kotlin Academy, passa a CoddyKit PRO. Il corso Kotlin Academy include 4 lezioni in totale.

Cosa imparerò in «Funzioni operator»?

Sovraccarichi plus, minus e così via Eserciti Kotlin Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Kotlin Academy?

Non è richiesta alcuna esperienza precedente. Kotlin Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Funzioni operator»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Kotlin Academy?

Sì. Ogni lezione Kotlin Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Funzioni operator
  2. Operatori di confronto
  3. Index e invoke
  4. Buone pratiche
← Torna a Kotlin Academy