Kotlin Academy · Lektion

När ska varje alternativ användas

Avvägningar

Lektion 4 av 413 steg

När ska varje alternativ användas är en gratis lektion i Kotlin Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Kotlin Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Kotlin Academy innehåller totalt 4 lektioner.

Två verktyg med olika uppgifter

Infix-funktioner handlar om läsbarhet; tailrec-funktioner handlar om säker och effektiv rekursion. De löser olika problem.

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

Välj infix för lättlästa API:er

Välj infix när ett anrop blir mer lättläst utan punkter och parenteser, särskilt i DSL:er och vid skapande av par.

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

Välj tailrec för djup rekursion

Använd tailrec när en rekursiv algoritm kan bli så djup att stacken riskerar att överskridas.

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

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

Avvägningar med infix

Infix tar bort interpunktion, vilket kan minska tydligheten för ovana läsare och komplicera prioriteten. Använd det endast när det tydligt hjälper.

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

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

Avvägningar med tailrec

Att göra kod svansrekursiv kräver ofta en ackumulator, vilket kan kännas mindre direkt än en vanlig loop. Väg uttrycksfullhet 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 loop är enklare

Om en vanlig for- eller while-loop är tydligare än svansrekursion bör ni föredra loopen. Rekursion är ett verktyg, inte ett 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 ett namngivet anrop är tydligare

Om ett infixnamn inte uppenbart uttrycker en binär relation kommunicerar ett vanligt metodanrop avsikten bättre.

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

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

Kombinera båda

De två funktionerna är oberoende av varandra. Ett och samma program kan använda infix för lättlästa anrop och tailrec för säker rekursion.

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

Checklista för läsbarhet

Fråga er: gör infix anropet tydligare för en nybörjare? Förhindrar tailrec en verklig risk för stack overflow? Om inte bör ni föredra vanliga funktioner och loopar.

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

Prestandaanmärkning

tailrec ger loopliknande prestanda med konstant stackutrymme. Infix har ingen kostnad vid körning utan är enbart syntaktiskt.

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

Sammanfattning av valet

Infix: lättlästa anrop i binär stil med ett argument. Tailrec: rekursion som måste kunna skalas säkert. Ingen av dem är ett standardval; båda är medvetna val.

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

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

Snabb kontroll

Testa era kunskaper om när ni bör använda de olika funktionerna.

Sammanfattning

Ni har lärt er när ni bör använda de olika funktionerna:

  • Använd infix för lättlästa binärliknande anrop och DSL:er.
  • Använd tailrec för rekursion som måste kunna skalas utan stack overflow.
  • Föredra vanliga loopar eller namngivna funktioner när de är tydligare.
  • De två funktionerna är oberoende och kan kombineras.
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 att börja

Lär dig Kotlin med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”När ska varje alternativ användas” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Kotlin Academy, inklusive ”När ska varje alternativ användas”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Kotlin Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”När ska varje alternativ användas”?

Avvägningar Ni övar på Kotlin Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Kotlin Academy?

Du behöver inga förkunskaper. Utbildningen i Kotlin Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”När ska varje alternativ användas”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Kotlin Academy-lektionen?

Ja. Varje Kotlin Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Infixfunktioner
  2. Bygga DSL-liknande API:er
  3. tailrec-funktioner
  4. När ska varje alternativ användas
← Tillbaka till Kotlin Academy