0Pricing
Kotlin Academy · Lección

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 this implí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

  1. Lambda con receptor: base de los DSL
  2. @DslMarker: evitar fugas del receptor
  3. Crear un DSL de HTML/configuración seguro respecto a tipos
  4. Probar y evolucionar DSL sin perjudicar a los usuarios
← Volver a Kotlin Academy