0Pricing
Kotlin Academy · Pelajaran

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 this implisit 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

  1. Lambda dengan Receiver: Dasar DSL
  2. @DslMarker: Mencegah Kebocoran Receiver
  3. Membangun DSL HTML/Config yang Aman terhadap Tipe
  4. Menguji dan Mengembangkan DSL Tanpa Mengganggu Pengguna
← Kembali ke Kotlin Academy