När ska varje alternativ användas
Avvägningar
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
infixför lättlästa binärliknande anrop och DSL:er. - Använd
tailrecfö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))
}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
- Infixfunktioner
- Bygga DSL-liknande API:er
- tailrec-funktioner
- När ska varje alternativ användas