Lambda con receptor: base de los DSL
Comprenda los tipos de función con receptores y cómo permiten la sintaxis DSL.
Lambda con receptor: base de los DSL es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué es una lambda con receptor?
Una lambda con receptor es un literal de función cuyo cuerpo tiene acceso a los miembros de un objeto receptor designado, sin ningún calificador. El tipo tiene la forma: (ReceiverType) -> ReturnType, escrita como ReceiverType.() -> ReturnType.
Comparación de sintaxis
Una lambda normal: { value: Int -> value + 1 }. Una lambda con receptor: StringBuilder.() -> Unit; dentro de esta lambda, this hace referencia a la instancia de StringBuilder.
val addHello: StringBuilder.() -> Unit = {
append("Hello") // this = StringBuilder
append(", World")
}Uso de with para aplicar una lambda con receptor
La función with de la biblioteca estándar acepta un receptor y una lambda con receptor. Ejecuta la lambda con el objeto proporcionado como this:
val result = with(StringBuilder()) {
append("Kotlin")
append(" DSLs")
toString()
} // result = "Kotlin DSLs"Declaración de su propia función builder
Puede escribir funciones que acepten lambdas con receptores para crear pequeñas API builder:
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
}Llamada al builder
Dentro de la lambda, this es el HtmlTag, por lo que sus miembros están disponibles directamente:
val page = div {
children += HtmlTag("p")
}apply es una lambda con receptor
La función de ámbito apply es el ejemplo más sencillo: ejecuta una lambda con receptor sobre this y devuelve this:
val list = mutableListOf<Int>().apply {
add(1)
add(2)
add(3)
} // list = [1, 2, 3]El patrón DSL
Las DSL se construyen anidando funciones builder que aceptan una lambda con receptor. Cada nivel controla su propio receptor, lo que proporciona una estructura natural e indentada que refleja la jerarquía de los datos.
html {
head { title("My Page") }
body {
div {
p("Hello!")
}
}
}Tipos de función con receptor
Puede almacenar lambdas con receptores en variables mediante el tipo de función T.() -> R:
val greet: String.() -> String = { "Hello, $this!" }
println("World".greet()) // "Hello, World!"Funciones de extensión frente a lambdas con receptor
Las funciones de extensión y las lambdas con receptor comparten el mismo mecanismo: ambas proporcionan un this implícito. La diferencia es que una función de extensión se declara en tiempo de compilación, mientras que una lambda con receptor es un valor que puede pasarse de un sitio a otro.
Composición de lambdas con receptor
Puede componer varias funciones builder para crear DSL jerárquicas y completas. La clave es que cada función builder establece su propio receptor, manteniendo aislados los ámbitos.
Inferencia de tipos y lambdas con receptor
Kotlin infiere el tipo del receptor a partir de la declaración del parámetro, por lo que quienes llaman a la función no necesitan anotar sus lambdas. El compilador sabe qué es this dentro del bloque.
Comprobación rápida
Dentro de una lambda con receptor de tipo StringBuilder.() -> Unit, ¿a qué hace referencia this?
Resumen: lambda con receptor
Conclusiones clave:
- La lambda con receptor proporciona un
thisimplícito dentro de su cuerpo - Se declara como
ReceiverType.() -> ReturnType - Es la base de todas las DSL de Kotlin
- La biblioteca estándar la usa en
apply,with,run,buildString, etc.
Preguntas frecuentes
¿La lección «Lambda con receptor: base de los DSL» es gratis?
Sí — el texto completo de «Lambda con receptor: base de los DSL» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Lambda con receptor: base de los DSL»?
Comprenda los tipos de función con receptores y cómo permiten la sintaxis DSL. Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Kotlin Academy?
No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Lambda con receptor: base de los DSL»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?
Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Lambda con receptor: base de los DSL
- @DslMarker: evitar fugas del receptor
- Crear un DSL de HTML/configuración seguro respecto a tipos
- Probar y evolucionar DSL sin perjudicar a los usuarios