0Pricing
Kotlin Academy · Lektion

Lambda mit Receiver: Grundlage für DSLs

Verstehen Sie Funktionstypen mit Receivern und wie diese DSL-Syntax ermöglichen.

Lambda mit Receiver: Grundlage für DSLs ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist ein Lambda mit Receiver?

Ein Lambda mit Receiver ist ein Funktionsliteral, dessen Rumpf ohne Qualifizierer auf die Member eines festgelegten Receiver-Objekts zugreifen kann. Der Typ sieht folgendermaßen aus: (ReceiverType) -> ReturnType, geschrieben als ReceiverType.() -> ReturnType.

Syntaxvergleich

Ein reguläres Lambda: { value: Int -> value + 1 }. Ein Lambda mit Receiver: StringBuilder.() -> Unit – innerhalb dieses Lambdas verweist this auf die StringBuilder-Instanz.

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

with zum Anwenden eines Receiver-Lambdas verwenden

Die Standardbibliotheksfunktion with akzeptiert einen Receiver und ein Lambda mit Receiver. Sie ruft das Lambda mit dem angegebenen Objekt als this auf:

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

Eigene Builder-Funktion deklarieren

Sie können Funktionen schreiben, die Lambdas mit Receiver akzeptieren, um APIs im Mini-Builder-Stil zu erstellen:

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
}

Den Builder aufrufen

Im Lambda ist this der HtmlTag, daher sind dessen Member direkt verfügbar:

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

apply ist ein Lambda mit Receiver

Die Scope-Funktion apply ist das einfachste Beispiel: Sie ruft ein Lambda mit Receiver mit this als Receiver auf und gibt this zurück:

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

Das DSL-Muster

DSLs entstehen, indem Builder-Funktionen verschachtelt werden, die jeweils ein Lambda mit Receiver akzeptieren. Jede Ebene steuert ihren eigenen Receiver und erzeugt eine natürliche, eingerückte Struktur, die die Datenhierarchie widerspiegelt.

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

Funktionstypen mit Receiver

Sie können Lambdas mit Receiver in Variablen speichern, indem Sie den Funktionstyp T.() -> R verwenden:

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

Erweiterungsfunktionen vs. Lambdas mit Receiver

Erweiterungsfunktionen und Lambdas mit Receiver verwenden denselben Mechanismus: Beide stellen ein implizites this bereit. Der Unterschied besteht darin, dass eine Erweiterungsfunktion zur Kompilierzeit deklariert wird, während ein Lambda mit Receiver ein Wert ist, der weitergereicht werden kann.

Receiver-Lambdas zusammensetzen

Mehrere Builder-Funktionen lassen sich zu umfangreichen hierarchischen DSLs zusammensetzen. Entscheidend ist, dass jede Builder-Funktion ihren eigenen Receiver festlegt und so die Gültigkeitsbereiche getrennt hält.

Typermittlung und Receiver-Lambdas

Kotlin ermittelt den Receiver-Typ aus der Parameterdeklaration, sodass Aufrufende ihre Lambdas nicht annotieren müssen. Der Compiler weiß, worauf sich this innerhalb des Blocks bezieht.

Kurzer Test

Worauf verweist this innerhalb eines Lambdas mit Receiver vom Typ StringBuilder.() -> Unit?

Zusammenfassung: Lambda mit Receiver

Wichtigste Erkenntnisse:

  • Ein Lambda mit Receiver stellt innerhalb seines Rumpfs ein implizites this bereit
  • Deklariert als ReceiverType.() -> ReturnType
  • Grundlage aller Kotlin-DSLs
  • Die Standardbibliothek verwendet es unter anderem in apply, with, run und buildString

Häufig gestellte Fragen

Ist die Lektion „Lambda mit Receiver: Grundlage für DSLs“ kostenlos?

Ja — der vollständige Text von „Lambda mit Receiver: Grundlage für DSLs“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Lambda mit Receiver: Grundlage für DSLs“?

Verstehen Sie Funktionstypen mit Receivern und wie diese DSL-Syntax ermöglichen. Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Kotlin Academy zu starten?

Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Lambda mit Receiver: Grundlage für DSLs“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?

Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Lambda mit Receiver: Grundlage für DSLs
  2. @DslMarker: Receiver-Leaks verhindern
  3. Eine typsichere HTML-/Config-DSL erstellen
  4. DSLs testen und weiterentwickeln, ohne Nutzer zu beeinträchtigen
← Zurück zu Kotlin Academy