CodeBlanks Logo Icon CodeBlanks

Inline function

inline ve noinline ile performans güvenliği öğrenirsin.

inline ne yapar?

inline anahtar sözcüğü, bir fonksiyonun gövdesini çağrıldığı yere kopyalamasını söyler. Bu, yüksek dereceli fonksiyonlarda lambda oluşturma yükünü azaltır.

Örnek: inline fun forEachTwice(items: List<Int>, action: (Int) -> Unit). Burada action lambdası her çağrıda yeni bir nesne oluşturmaz; doğrudan gövdeye kopyalanır. Bu, performansı artırır ama bytecode boyutunu büyütür. Uzun gövdeli fonksiyonlarda inline kullanmamak daha iyidir. Kısa, lambda parametreli fonksiyonlarda idealdir.

noinline ve crossunlune

Bazen bir lambda parametresinin inline edilmesini istemezsin. O zaman noinline işaretini koyarsın: noinline action: () -> Unit.

Bazen de inline edilen lambda, içinden lokal olmayan dönüş (non-local return) yapar; bu da bazı bağlamlarda sorun çıkarır. Bunu önlemek için crossinline kullanılır. Örnek: bir inline fonksiyon içinde lambda'yı başka bir fonksiyona geçerken crossinline gerekir. İki anahtar sözcük de yalnızca inline fonksiyonların parametrelerinde geçerlidir.

Uygulama inline forEachTwice yaz

inline fun forEachTwice(items: List<Int>, action: (Int) -> Unit) tanımla. Her öğe için action'ı iki kez çağırsın. main içinde listOf(1, 2) ile çağırıp her adımda println(it) yapsın.

Başlangıç kodu

Main.kt
// anahtar sözcüğü ekle
fun forEachTwice(items: List<Int>, action: (Int) -> Unit) {
    for (i in items) {
        // action'ı iki kez çağır
    }
}

fun main() {
    forEachTwice(listOf(1, 2)) { /* öğeyi yazdır */ }
}

Örnek çözüm

Main.kt
inline fun forEachTwice(items: List<Int>, action: (Int) -> Unit) {
    for (i in items) {
        action(i)
        action(i)
    }
}
fun main() {
    forEachTwice(listOf(1, 2)) { println(it) }
}

Beklenen çıktı

1
1
2
2

Soru ve cevaplar

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

1 inline anahtar sözcüğünü ekle

Soru
____ fun twice(action: () -> Unit) {
    action()
    action()
}
Cevap
inline fun twice(action: () -> Unit) {
    action()
    action()
}

Açıklama: inline, lambda parametreli fonksiyonları en iyiler.

2 inline anahtarlarını eşle

Kavram Anlamı
inline Gövdeyi kopyalar
noinline Parametreyi kopyalama
crossunlune Lokal dönüşü yasaklar
fun Fonksiyon bildirimi

3 inline fonksiyon ne zaman tercih edilir?

  • Kısa, lambda parametreli ve sık çağrılan fonksiyonlarda Doğru cevap
  • Yalnızca soyut sınıf metotlarında
  • Uzun gövdeli ve nadir çağrılan fonksiyonlarda
  • Sadece inline edilemeyen generic fonksiyonlarda

Açıklama: inline kısa ve sık çağrılan lambda-parametreli fonksiyonlarda en iyisini verir.

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