Operaattorifunktiot
Ylikuormita plus, miinus ja muut
Operaattorifunktiot on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Kotlin Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.
Mitä operaattorien ylikuormitus tarkoittaa
Operaattorien ylikuormituksen avulla omat tyyppinne voivat reagoida symboleihin, kuten + tai -. Määrittelette funktion, jolla on operator-määre ja erityinen nimi.
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))
}operator-avainsana
operator-määre kertoo kääntäjälle, että tämä funktio toteuttaa operaattorin. Ilman sitä kutsu a + b ei toimisi.
data class Money(val amount: Int) {
operator fun plus(o: Money) = Money(amount + o.amount)
}
fun main() {
println(Money(5) + Money(3))
}Vakiintuneet nimet
Jokainen operaattori vastaa kiinteää funktion nimeä: plus vastaa operaattoria +, minus operaattoria -, times operaattoria *, div operaattoria / ja rem operaattoria %.
data class Vec(val n: Int) {
operator fun times(k: Int) = Vec(n * k)
}
fun main() {
println(Vec(4) * 3)
}Minus ja times
Voitte määritellä samaan tyyppiin useita operaattoreita.
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)
}Unaarioperaattorit
Unaarinen miinus käyttää unaryMinus-funktiota, unaarinen plus käyttää unaryPlus-funktiota ja not toteuttaa !-operaattorin.
data class Temp(val c: Int) {
operator fun unaryMinus() = Temp(-c)
}
fun main() {
println(-Temp(10))
}Kasvattaminen ja vähentäminen
inc toteuttaa ++-operaattorin ja dec toteuttaa ---operaattorin. Ne palauttavat uuden saman tyyppisen arvon.
data class Counter(val n: Int) {
operator fun inc() = Counter(n + 1)
}
fun main() {
var c = Counter(0)
c++
println(c.n)
}Yhdistetty sijoitus
plusAssign toteuttaa muuttuville vastaanottajille operaattorin +=. Jos vain plus on määritelty, += sijoittaa muuttujalle uuden arvon.
class Bag {
val items = mutableListOf<String>()
operator fun plusAssign(item: String) { items.add(item) }
}
fun main() {
val bag = Bag()
bag += "apple"
println(bag.items)
}Eri tyyppien operaattorit
Parametrin tyypin ei tarvitse vastata vastaanottajan tyyppiä. Tässä pisteen skaalaaminen tyypillä Int palauttaa pisteen.
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)
}Laajennusfunktioina
Operaattoreita voi määritellä laajennusfunktioina myös tyypeille, joita ette omista.
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))
}Operaattorien ketjuttaminen
Ylikuormitetut operaattorit yhdistyvät sisäänrakennettujen operaattorien tavoin ja noudattavat normaalia operaattorien etusijaa.
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)
}Paluutyypin voi valita vapaasti
Operaattori voi palauttaa minkä tahansa tyypin, mutta saman tyypin palauttaminen pitää käytön intuitiivisena ja mahdollistaa ketjuttamisen.
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))
}Pikatarkistus
Testatkaa, miten hyvin ymmärrätte operaattorifunktioita.
Kertaus
Opitte operaattorifunktioista:
- Merkitkää funktiot
operator-määreellä ja vakiintuneella nimellä, kutenplus,minustaitimes. - Unaari-, kasvatus- ja yhdistetyn sijoituksen operaattoreita tuetaan.
- Operaattorit voivat olla jäseniä tai laajennuksia.
- Saman tyypin palauttaminen tekee ketjuttamisesta intuitiivista.
data class P(val x: Int) {
operator fun plus(o: P) = P(x + o.x)
}
fun main() {
println((P(2) + P(3)).x)
}Opi Kotlin tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 51
- Oppitunnit
- 203
Usein kysytyt kysymykset
Onko oppitunti ”Operaattorifunktiot” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Operaattorifunktiot”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Operaattorifunktiot”?
Ylikuormita plus, miinus ja muut Harjoittelet Kotlin Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Kotlin Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Kotlin Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Operaattorifunktiot”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Kotlin Academy-oppitunnilla?
Kyllä. Jokainen Kotlin Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Operaattorifunktiot
- Vertailuoperaattorit
- Indeksointi ja kutsuminen
- Parhaat käytännöt