Özet - Compile-time safety
- Kotlin kursu
- Uzman
- Ders 6/47
- 5 dk
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
// 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
@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
inline fun describe(): String = "${____<T>()}:$value"
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 |