0Pricing
Kotlin Academy · Lekcja

Lambda z odbiorcą: podstawa DSL

Poznaj typy funkcji z odbiorcami i dowiedz się, jak umożliwiają składnię DSL.

Lambda z odbiorcą: podstawa DSL to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Czym jest lambda z odbiorcą

Lambda z odbiorcą to literał funkcji, którego ciało ma dostęp do elementów wyznaczonego obiektu odbiorcy — bez używania kwalifikatora. Jej typ wygląda tak: (ReceiverType) -> ReturnType, zapisywany jako ReceiverType.() -> ReturnType.

Porównanie składni

Zwykła lambda: { value: Int -> value + 1 }. Lambda z odbiorcą: StringBuilder.() -> Unit — wewnątrz tej lambdy this odnosi się do instancji StringBuilder.

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

Używanie with do zastosowania lambdy z odbiorcą

Funkcja biblioteki standardowej with przyjmuje odbiorcę i lambdę z odbiorcą. Wywołuje lambdę z podanym obiektem jako this:

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

Deklarowanie własnej funkcji budującej

Można pisać funkcje przyjmujące lambdy z odbiorcami, aby tworzyć miniinterfejsy API typu 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
}

Wywoływanie buildera

Wewnątrz lambdy this jest obiektem HtmlTag, dlatego jego elementy są dostępne bezpośrednio:

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

apply jest lambdą z odbiorcą

Funkcja zakresowa apply jest najprostszym przykładem: wywołuje lambdę z odbiorcą na this i zwraca this:

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

Wzorzec DSL

Języki DSL buduje się przez zagnieżdżanie funkcji budujących, z których każda przyjmuje lambdę z odbiorcą. Każdy poziom kontroluje własnego odbiorcę, zapewniając naturalną, wciętą strukturę odzwierciedlającą hierarchię danych.

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

Typy funkcji z odbiorcą

Można przechowywać lambdy z odbiorcami w zmiennych, używając typu funkcji T.() -> R:

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

Funkcje rozszerzające a lambdy z odbiorcą

Funkcje rozszerzające i lambdy z odbiorcą korzystają z tego samego mechanizmu: obie udostępniają niejawne this. Różnica polega na tym, że funkcja rozszerzająca jest deklarowana w czasie kompilacji, natomiast lambda z odbiorcą jest wartością, którą można przekazywać dalej.

Komponowanie lambd z odbiorcami

Można komponować wiele funkcji budujących, aby tworzyć rozbudowane hierarchiczne języki DSL. Kluczowe jest to, że każda funkcja budująca ustawia własnego odbiorcę, dzięki czemu zakresy pozostają od siebie odizolowane.

Wnioskowanie typów a lambdy z odbiorcami

Kotlin wnioskuje typ odbiorcy z deklaracji parametru, więc wywołujący nie muszą dodawać adnotacji do swoich lambd. Kompilator wie, czym jest this wewnątrz bloku.

Szybkie sprawdzenie

Do czego odnosi się this wewnątrz lambdy z odbiorcą typu StringBuilder.() -> Unit?

Podsumowanie: lambda z odbiorcą

Najważniejsze informacje:

  • Lambda z odbiorcą udostępnia niejawne this wewnątrz swojego ciała
  • Jest deklarowana jako ReceiverType.() -> ReturnType
  • Stanowi podstawę wszystkich języków DSL w Kotlinie
  • Biblioteka standardowa używa jej w funkcjach apply, with, run, buildString itd.

Często zadawane pytania

Czy lekcja „Lambda z odbiorcą: podstawa DSL” jest bezpłatna?

Tak — pełny tekst „Lambda z odbiorcą: podstawa DSL” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Lambda z odbiorcą: podstawa DSL”?

Poznaj typy funkcji z odbiorcami i dowiedz się, jak umożliwiają składnię DSL. Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?

Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Lambda z odbiorcą: podstawa DSL”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?

Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Lambda z odbiorcą: podstawa DSL
  2. @DslMarker: zapobieganie wyciekaniu odbiorcy
  3. Budowanie bezpiecznego typowo DSL HTML/Config
  4. Testowanie i rozwijanie DSL bez łamania zgodności użytkowników
← Powrót do Kotlin Academy