Kotlin Academy · leksjon

Når hver av dem bør brukes

Avveininger

Leksjon 4 av 413 trinn

Når hver av dem bør brukes er en gratis leksjon i Kotlin Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Kotlin Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.

To verktøy med ulike oppgaver

Infix-funksjoner handler om lesbarhet, mens tailrec-funksjoner handler om trygg og effektiv rekursjon. De løser urelaterte problemer.

infix fun Int.add(o: Int) = this + o

tailrec fun sum(n: Int, acc: Int = 0): Int =
    if (n == 0) acc else sum(n - 1, acc + n)

fun main() {
    println(2 add 3)
    println(sum(10))
}

Velg infix for flytende API-er

Velg infix når et kall blir lettere å lese uten punktum og parenteser, særlig i DSL-er og ved bygging av par.

fun main() {
    val pair = "id" to 100
    println(pair)
}

Velg tailrec for dyp rekursjon

Bruk tailrec når en rekursiv algoritme kan bli så dyp at den fører til stakkoverflyt.

tailrec fun count(n: Int, acc: Int = 0): Int =
    if (n == 0) acc else count(n - 1, acc + 1)

fun main() {
    println(count(50000))
}

Avveininger ved infix

Infix fjerner tegnsetting, noe som kan gjøre koden mindre tydelig for uerfarne lesere og komplisere presedensen. Bruk det bare når det tydelig hjelper.

infix fun Int.scaledBy(f: Int) = this * f

fun main() {
    println(5 scaledBy 3)
}

Avveininger ved tailrec

Å gjøre kode halerekursiv krever ofte en akkumulator, noe som kan føles mindre direkte enn en vanlig løkke. Vei uttrykksfullhet mot enkelhet.

tailrec fun product(n: Int, acc: Long = 1): Long =
    if (n <= 1) acc else product(n - 1, acc * n)

fun main() {
    println(product(6))
}

Når en løkke er enklere

Hvis en vanlig for- eller while-løkke er tydeligere enn halerekursjon, bør du foretrekke løkken. Rekursjon er et verktøy, ikke et krav.

fun sumLoop(n: Int): Int {
    var total = 0
    for (i in 1..n) total += i
    return total
}

fun main() {
    println(sumLoop(10))
}

Når et navngitt kall er tydeligere

Hvis et infix-navn ikke åpenbart uttrykker en binær relasjon, kommuniserer et vanlig metodekall hensikten bedre.

data class Temp(val c: Int) {
    fun isWarmerThan(o: Temp) = c > o.c
}

fun main() {
    println(Temp(30).isWarmerThan(Temp(20)))
}

Kombinere begge

De to funksjonene er uavhengige. Ett program kan bruke infix for lesbare kall og tailrec for trygg rekursjon.

infix fun Int.upto(n: Int) = (this..n).toList()

tailrec fun last(list: List<Int>): Int =
    if (list.size == 1) list[0] else last(list.drop(1))

fun main() {
    println(last(1 upto 5))
}

Sjekkliste for lesbarhet

Spør deg selv: Gjør infix kallet tydeligere for en nybegynner? Forhindrer tailrec en reell risiko for stakkoverflyt? Hvis ikke, bør du foretrekke vanlige funksjoner og løkker.

fun main() {
    val r = (1..5).sum()
    println(r)
}

Ytelsesmerknad

tailrec gir løkkelignende ytelse med konstant stakkplass. Infix har ingen kjøretidskostnad; det er utelukkende syntaktisk.

tailrec fun pow(base: Int, exp: Int, acc: Long = 1): Long =
    if (exp == 0) acc else pow(base, exp - 1, acc * base)

fun main() {
    println(pow(2, 10))
}

Beslutningssammendrag

Infix: flytende kall i binær stil med ett argument. Tailrec: rekursjon som må kunne skaleres trygt. Ingen av delene er et standardvalg; begge bør brukes bevisst.

infix fun String.joinWith(o: String) = "$this-$o"

fun main() {
    println("a" joinWith "b")
}

Kort sjekk

Test forståelsen din av når du bør bruke de ulike funksjonene.

Oppsummering

Du har lært når du bør bruke de ulike funksjonene:

  • Bruk infix for flytende, lesbare kall i binær stil og for DSL-er.
  • Bruk tailrec for rekursjon som må kunne skaleres uten stakkoverflyt.
  • Foretrekk vanlige løkker eller navngitte funksjoner når de er tydeligere.
  • De to funksjonene er uavhengige og kan kombineres.
infix fun Int.by(o: Int) = this * o
tailrec fun dec(n: Int): Int = if (n == 0) 0 else dec(n - 1)

fun main() {
    println(3 by 4)
    println(dec(1000))
}
Gratis å komme i gang

Lær deg Kotlin med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
51
Leksjoner
203

Ofte stilte spørsmål

Er leksjonen «Når hver av dem bør brukes» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Kotlin Academy, inkludert «Når hver av dem bør brukes», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Når hver av dem bør brukes»?

Avveininger Du øver på Kotlin Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Kotlin Academy?

Ingen tidligere erfaring er nødvendig. Kotlin Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Når hver av dem bør brukes»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Kotlin Academy-leksjonen?

Ja. Alle Kotlin Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Infix-funksjoner
  2. Bygge DSL-lignende API-er
  3. tailrec-funksjoner
  4. Når hver av dem bør brukes
← Tilbake til Kotlin Academy