Lambda dengan Receiver: Dasar DSL
Pahami tipe fungsi dengan receiver dan cara tipe tersebut memungkinkan sintaks DSL.
Lambda dengan Receiver: Dasar DSL adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.
Apa Itu Lambda dengan Penerima?
Lambda dengan penerima adalah literal fungsi yang isi badannya dapat mengakses anggota objek penerima yang ditentukan—tanpa penentu apa pun. Bentuk tipenya adalah: (ReceiverType) -> ReturnType, yang ditulis sebagai ReceiverType.() -> ReturnType.
Perbandingan Sintaks
Lambda biasa: { value: Int -> value + 1 }. Lambda dengan penerima: StringBuilder.() -> Unit—di dalam lambda ini, this merujuk ke instans StringBuilder.
val addHello: StringBuilder.() -> Unit = {
append("Hello") // this = StringBuilder
append(", World")
}Menggunakan with untuk Menerapkan Lambda dengan Penerima
Fungsi pustaka standar with menerima sebuah penerima dan lambda dengan penerima. Fungsi ini memanggil lambda dengan objek yang diberikan sebagai this:
val result = with(StringBuilder()) {
append("Kotlin")
append(" DSLs")
toString()
} // result = "Kotlin DSLs"Mendeklarasikan Fungsi Pembangun Sendiri
Anda dapat menulis fungsi yang menerima lambda dengan penerima untuk membuat API pembangun mini:
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
}Memanggil Pembangun
Di dalam lambda, this adalah HtmlTag, sehingga anggotanya tersedia secara langsung:
val page = div {
children += HtmlTag("p")
}apply adalah Lambda dengan Penerima
Fungsi cakupan apply adalah contoh paling sederhana: fungsi ini memanggil lambda dengan penerima pada this dan mengembalikan this:
val list = mutableListOf<Int>().apply {
add(1)
add(2)
add(3)
} // list = [1, 2, 3]Pola DSL
DSL dibangun dengan menyarangkan fungsi pembangun yang masing-masing menerima lambda dengan penerima. Setiap tingkat mengendalikan penerimanya sendiri, sehingga menghasilkan struktur alami dan bertakik yang mencerminkan hierarki data.
html {
head { title("My Page") }
body {
div {
p("Hello!")
}
}
}Tipe Fungsi dengan Penerima
Anda dapat menyimpan lambda dengan penerima dalam variabel menggunakan tipe fungsi T.() -> R:
val greet: String.() -> String = { "Hello, $this!" }
println("World".greet()) // "Hello, World!"Fungsi Ekstensi vs. Lambda dengan Penerima
Fungsi ekstensi dan lambda dengan penerima menggunakan mekanisme yang sama: keduanya menyediakan this implisit. Perbedaannya adalah fungsi ekstensi dideklarasikan saat kompilasi, sedangkan lambda dengan penerima merupakan nilai yang dapat diteruskan.
Menggabungkan Lambda dengan Penerima
Beberapa fungsi pembangun dapat digabungkan untuk membuat DSL hierarkis yang kaya. Kuncinya adalah setiap fungsi pembangun menetapkan penerimanya sendiri, sehingga setiap cakupan tetap terpisah.
Inferensi Tipe dan Lambda dengan Penerima
Kotlin menyimpulkan tipe penerima dari deklarasi parameter, sehingga pemanggil tidak perlu memberi anotasi pada lambdanya. Kompilator mengetahui apa yang dimaksud dengan this di dalam blok.
Pemeriksaan Singkat
Di dalam lambda dengan penerima bertipe StringBuilder.() -> Unit, apa yang dirujuk oleh this?
Rangkuman: Lambda dengan Penerima
Hal-hal penting:
- Lambda dengan penerima menyediakan
thisimplisit di dalam badan lambda - Dideklarasikan sebagai
ReceiverType.() -> ReturnType - Menjadi dasar semua DSL Kotlin
- Pustaka standar menggunakannya dalam
apply,with,run,buildString, dan sebagainya
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Lambda dengan Receiver: Dasar DSL” gratis?
Ya — teks lengkap “Lambda dengan Receiver: Dasar DSL” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Lambda dengan Receiver: Dasar DSL”?
Pahami tipe fungsi dengan receiver dan cara tipe tersebut memungkinkan sintaks DSL. Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Kotlin Academy?
Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Lambda dengan Receiver: Dasar DSL” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?
Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Lambda dengan Receiver: Dasar DSL
- @DslMarker: Mencegah Kebocoran Receiver
- Membangun DSL HTML/Config yang Aman terhadap Tipe
- Menguji dan Mengembangkan DSL Tanpa Mengganggu Pengguna