CodeBlanks Logo Icon CodeBlanks

Özet - Compile-time safety

contracts, inline ve type-safe builder'ı birleştirerek bir DSL yazarsın.

Özet - Compile-time safety

Bu grupta beş derleme zamanı güvenliği aracını öğrendin: contracts, inline, reified, tailrec ve @DslMarker.

contracts derleyiciye davranış taahhüdü verir; inline lambda yükünü azaltır; reified tür silmeyi aşar; tailrec özyinelemeyi döngüye çevirir; @DslMarker DSL'lerde alıcı karışmasını önler. Şimdi bunları birleştiren küçük bir DSL yazacaksın: bir kutu, içindeki değerin türünü reified ile okuyacak ve inline ile yükten kaçınacaksın.

Birleştirme: Box DSL

Şimdi inline + reified + @DslMarker'ı birleştiren bir Box DSL yazacağız. Box bir değer tutar; tür etiketini reified ile okur.

Örnek: @BoxDsl class Box<T>(var value: T). inline fun <reified T> tag(): String = T::class.simpleName ?: "?". Box'a fun describe(): String = "${tag<T>()}:$value" metodu eklenir. Ama tag<T>() çağrısı Box sınıfı içindeyken inline fonksiyon olmalı; çünkü T yalnızca inline/reified ile görülebilir. Bu yüzden describe da inline olmalıdır.

Uygulama Box DSL yaz

@DslMarker annotation class BoxDsl tanımla. inline fun <reified T> tag(): String = T::class.simpleName ?: "?" yaz. @BoxDsl class Box<T>(var value: T) içine inline fun describe(): String = "${'$'}{tag<T>()}:${'$'}value" ekle. main içinde val b = Box(42) ve println(b.describe()) yaz.

Başlangıç kodu

Main.kt
// Box DSL yaz

annotation class BoxDsl

// tag fonksiyonunu ekle

class Box<T>(var value: T) {
    // describe metodunu ekle
}

fun main() {
    val b = Box(42)
    // describe çıktısını yazdır
}

Örnek çözüm

Main.kt
@DslMarker
annotation class BoxDsl
inline fun <reified T> tag(): String = T::class.simpleName ?: "?"
@BoxDsl
class Box<T>(var value: T) {
    inline fun describe(): String = "${tag<T>()}:$value"
}
fun main() {
    val b = Box(42)
    println(b.describe())
}

Beklenen çıktı

Int:42

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Hangi anahtar lambda yükünü azaltır?

  • inline Doğru cevap
  • reified
  • tailrec
  • @DslMarker

Açıklama: inline, lambda parametreli fonksiyonlarda gövdeyi çağrı yerine kopyalar.

2 describe metodunu tamamla

Soru
    inline fun describe(): String = "${____<T>()}:$value"
Cevap
    inline fun describe(): String = "${tag<T>()}:$value"

Açıklama: tag<T>() reified ile tür adını döner.

3 Beş aracı eşle

Kavram Anlamı
contracts Davranış taahhüdü
inline Gövdeyi kopyalar
reified Tür silmeyi aşar
tailrec Döngüye çevirir
@DslMarker Alıcı karışmasını önler

Uzman bölümündeki tüm dersler