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
thisbereit - Deklariert als
ReceiverType.() -> ReturnType - Grundlage aller Kotlin-DSLs
- Die Standardbibliothek verwendet es unter anderem in
apply,with,runundbuildString
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
- Lambda mit Receiver: Grundlage für DSLs
- @DslMarker: Receiver-Leaks verhindern
- Eine typsichere HTML-/Config-DSL erstellen
- DSLs testen und weiterentwickeln, ohne Nutzer zu beeinträchtigen