Lambda avec récepteur : fondement des DSL
Comprenez les types de fonctions avec récepteurs et leur rôle dans la syntaxe des DSL.
Lambda avec récepteur : fondement des DSL est une leçon Kotlin Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Kotlin Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Kotlin Academy comprend 4 leçons au total.
Qu'est-ce qu'une lambda avec récepteur ?
Une lambda avec récepteur est un littéral de fonction dont le corps peut accéder aux membres d'un objet récepteur désigné — sans aucun qualificatif. Son type se présente ainsi : (ReceiverType) -> ReturnType, et s'écrit ReceiverType.() -> ReturnType.
Comparaison de la syntaxe
Une lambda ordinaire : { value: Int -> value + 1 }. Une lambda avec récepteur : StringBuilder.() -> Unit — dans cette lambda, this désigne l'instance de StringBuilder.
val addHello: StringBuilder.() -> Unit = {
append("Hello") // this = StringBuilder
append(", World")
}Utiliser with pour appliquer une lambda avec récepteur
La fonction de la bibliothèque standard with accepte un récepteur et une lambda avec récepteur. Elle appelle la lambda en utilisant l'objet fourni comme this :
val result = with(StringBuilder()) {
append("Kotlin")
append(" DSLs")
toString()
} // result = "Kotlin DSLs"Déclarer votre propre fonction de construction
Vous pouvez écrire des fonctions qui acceptent des lambdas avec récepteur afin de créer de petites API de construction :
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
}Appeler le constructeur
Dans la lambda, this est le HtmlTag, ses membres sont donc directement disponibles :
val page = div {
children += HtmlTag("p")
}apply est une lambda avec récepteur
La fonction de portée apply en est l'exemple le plus simple : elle appelle une lambda avec récepteur sur this et retourne this :
val list = mutableListOf<Int>().apply {
add(1)
add(2)
add(3)
} // list = [1, 2, 3]Le modèle DSL
Les DSL sont construits en imbriquant des fonctions de construction qui acceptent chacune une lambda avec récepteur. Chaque niveau contrôle son propre récepteur, ce qui crée une structure naturelle et indentée qui reflète la hiérarchie des données.
html {
head { title("My Page") }
body {
div {
p("Hello!")
}
}
}Types de fonction avec récepteur
Vous pouvez stocker des lambdas avec récepteur dans des variables en utilisant le type de fonction T.() -> R :
val greet: String.() -> String = { "Hello, $this!" }
println("World".greet()) // "Hello, World!"Fonctions d'extension et lambdas avec récepteur
Les fonctions d'extension et les lambdas avec récepteur reposent sur le même mécanisme : toutes deux fournissent un this implicite. La différence est qu'une fonction d'extension est déclarée à la compilation, tandis qu'une lambda avec récepteur est une valeur qui peut être transmise.
Composer des lambdas avec récepteur
Plusieurs fonctions de construction peuvent être composées pour créer des DSL hiérarchiques riches. L'essentiel est que chaque fonction de construction définisse son propre récepteur, afin de garder les portées isolées.
Inférence de type et lambdas avec récepteur
Kotlin déduit le type du récepteur à partir de la déclaration du paramètre, les appelants n'ont donc pas besoin d'annoter leurs lambdas. Le compilateur sait ce que représente this à l'intérieur du bloc.
Vérification rapide
Dans une lambda avec récepteur de type StringBuilder.() -> Unit, que désigne this ?
Récapitulatif : lambda avec récepteur
Points essentiels :
- Une lambda avec récepteur fournit un
thisimplicite dans son corps - Elle se déclare sous la forme
ReceiverType.() -> ReturnType - Elle constitue le fondement de tous les DSL Kotlin
- La bibliothèque standard l'utilise dans
apply,with,run,buildString, etc.
Questions Fréquemment Posées
La leçon « Lambda avec récepteur : fondement des DSL » est-elle gratuite ?
Oui — le texte complet de « Lambda avec récepteur : fondement des DSL » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Kotlin Academy, passe à CoddyKit PRO. Le cours Kotlin Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Lambda avec récepteur : fondement des DSL » ?
Comprenez les types de fonctions avec récepteurs et leur rôle dans la syntaxe des DSL. Tu pratiques Kotlin Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Kotlin Academy ?
Aucune expérience préalable n'est requise. Kotlin Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Lambda avec récepteur : fondement des DSL » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Kotlin Academy ?
Oui. Chaque leçon Kotlin Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Lambda avec récepteur : fondement des DSL
- @DslMarker : empêcher les fuites de récepteurs
- Construire un DSL HTML/de configuration sûr du point de vue des types
- Tester et faire évoluer des DSL sans perturber les utilisateurs