Kotlin Academy · leksjon

Lambda med mottaker: Grunnlaget for DSL-er

Forstå funksjonstyper med mottakere, og hvordan de muliggjør DSL-syntaks.

Leksjon 1 av 413 trinn

Lambda med mottaker: Grunnlaget for DSL-er er en gratis leksjon i Kotlin Academy på CoddyKit. Dette er leksjon 1 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.

Hva er en lambda med mottaker?

En lambda med mottaker er en funksjonsliteral der kroppen har tilgang til medlemmene i et angitt mottakerobjekt – uten noen kvalifikator. Typen ser slik ut: (ReceiverType) -> ReturnType, skrevet som ReceiverType.() -> ReturnType.

Sammenligning av syntaks

En vanlig lambda: { value: Int -> value + 1 }. En lambda med mottaker: StringBuilder.() -> Unit – inne i denne lambdaen viser this til StringBuilder-instansen.

val addHello: StringBuilder.() -> Unit = {
    append("Hello")   // this = StringBuilder
    append(", World")
}

Bruke with til å anvende en lambda med mottaker

Standardbibliotekfunksjonen with tar imot en mottaker og en lambda med mottaker. Den kaller lambdaen med det angitte objektet som this:

val result = with(StringBuilder()) {
    append("Kotlin")
    append(" DSLs")
    toString()
}  // result = "Kotlin DSLs"

Deklarere egen builder-funksjon

Du kan skrive funksjoner som tar imot lambdaer med mottakere, for å lage små builder-API-er:

class HtmlTag(val name: String) {
    val children = mutableListOf<HtmlTag>()
    fun render(): String = "<$name>${children.joinToString("") { it.render() }}</$name>"
}

fun div(block: HtmlTag.() -> Unit): HtmlTag {
    val tag = HtmlTag("div")
    tag.block()
    return tag
}

Kalle builderen

Inne i lambdaen er this lik HtmlTag, så medlemmene er tilgjengelige direkte:

val page = div {
    children += HtmlTag("p")
}

apply bruker en lambda med mottaker

Scope-funksjonen apply er det enkleste eksempelet: Den kaller en lambda med mottaker på this og returnerer this:

val list = mutableListOf<Int>().apply {
    add(1)
    add(2)
    add(3)
}   // list = [1, 2, 3]

DSL-mønsteret

DSL-er bygges ved å nøste builder-funksjoner som hver tar imot en lambda med mottaker. Hvert nivå styrer sin egen mottaker, noe som gir en naturlig, innrykket struktur som gjenspeiler datahierarkiet.

html {
    head { title("My Page") }
    body {
        div {
            p("Hello!")
        }
    }
}

Funksjonstyper med mottaker

Du kan lagre lambdaer med mottakere i variabler ved å bruke funksjonstypen T.() -> R:

val greet: String.() -> String = { "Hello, $this!" }
println("World".greet())  // "Hello, World!"

Utvidelsesfunksjoner kontra lambdaer med mottaker

Utvidelsesfunksjoner og lambdaer med mottaker bygger på samme mekanisme: Begge gir en implisitt this. Forskjellen er at en utvidelsesfunksjon deklareres ved kompilering, mens en lambda med mottaker er en verdi som kan sendes rundt.

Kombinere lambdaer med mottakere

Flere builder-funksjoner kan kombineres for å lage innholdsrike hierarkiske DSL-er. Nøkkelen er at hver builder-funksjon angir sin egen mottaker, slik at områdene holdes adskilt.

Typeinferens og lambdaer med mottakere

Kotlin utleder mottakertypen fra parameterdeklarasjonen, så kallere trenger ikke å angi typen for lambdaene sine. Kompilatoren vet hva this er inne i blokken.

Kunnskapssjekk

Hva viser this til inne i en lambda med mottakertypen StringBuilder.() -> Unit?

Oppsummering: lambda med mottaker

Viktigste punkter:

  • En lambda med mottaker gir en implisitt this inne i lambdakroppen
  • Deklareres som ReceiverType.() -> ReturnType
  • Grunnlaget for alle Kotlin-DSL-er
  • Standardbiblioteket bruker dette i apply, with, run, buildString og så videre
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 «Lambda med mottaker: Grunnlaget for DSL-er» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Kotlin Academy, inkludert «Lambda med mottaker: Grunnlaget for DSL-er», 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 «Lambda med mottaker: Grunnlaget for DSL-er»?

Forstå funksjonstyper med mottakere, og hvordan de muliggjør DSL-syntaks. 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 1 av 4.

Hvor lang tid tar leksjonen «Lambda med mottaker: Grunnlaget for DSL-er»?

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. Lambda med mottaker: Grunnlaget for DSL-er
  2. @DslMarker: Hindre lekkasje av mottakere
  3. Bygge en typesikker HTML-/Config-DSL
  4. Teste og videreutvikle DSL-er uten å bryte brukere
← Tilbake til Kotlin Academy