CodeBlanks Logo Icon CodeBlanks

Generic fonksiyon

<T> ile generic fonksiyon yazmayı öğrenirsin.

Generic fonksiyon

Generic'ler, aynı kodu farklı türlerle çalıştırmayı sağlar. Tür parametresi açılı parantezde tanımlanır ve trait sınırlarıyla ne yapılabileceği söylenir:

fn en_buyuk<T: PartialOrd + Copy>(v: &[T]) -> T {
    let mut eb = v[0];
    for &x in v {
        if x > eb {
            eb = x;
        }
    }
    eb
}

PartialOrd olmadan > kullanılamaz; Copy olmadan v[0] dilimden dışarı kopyalanamaz.

Monomorfizasyon

Derleyici, generic fonksiyonu kullanıldığı her somut tür için ayrı ayrı üretir. en_buyuk(&[1, 2]) ve en_buyuk(&['a', 'b']) çağrıları iki ayrı makine kodu oluşturur:

// derleyicinin ürettiği (kavramsal olarak)
fn en_buyuk_i32(v: &[i32]) -> i32 { .. }
fn en_buyuk_char(v: &[char]) -> char { .. }

Bu yüzden generic'lerin çalışma anı maliyeti yoktur; bedeli biraz daha uzun derleme süresi ve daha büyük ikili dosyadır.

Uygulama En büyüğü bul

Yukarıdaki en_buyuk<T: PartialOrd + Copy> fonksiyonunu yaz. [3, 9, 2], ['a', 'z', 'm'] ve [1.5, 2.5, 0.5] için sonuçları boşlukla tek satırda yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn en_buyuk<T: PartialOrd + Copy>(v: &[T]) -> T {
    let mut eb = v[0];
    for &x in v {
        if x > eb {
            eb = x;
        }
    }
    eb
}

fn main() {
    println!("{} {} {}", en_buyuk(&[3, 9, 2]), en_buyuk(&['a', 'z', 'm']), en_buyuk(&[1.5, 2.5, 0.5]));
}

Beklenen çıktı

9 z 2.5

Soru ve cevaplar

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

1 <code>fn f&lt;T&gt;(a: T, b: T) -&gt; T { a + b }</code> neden derlenmez?

  • Derlenir
  • T için toplama tanımlı olduğu bilinmiyor; T: std::ops::Add<Output = T> gerekir Doğru cevap
  • Generic fonksiyon değer döndüremez
  • İki parametre aynı türde olamaz

Açıklama: Generic koddaki her işlem bir trait sınırıyla güvenceye alınmalıdır; derleyici T hakkında başka bir şey varsaymaz.

2 Tür parametresi

Soru
fn en_buyuk____(v: &[T]) -> T {
    // ...
}
Cevap
fn en_buyuk<T: PartialOrd + Copy>(v: &[T]) -> T {
    // ...
}

Açıklama: Karşılaştırma ve kopyalama için T'ye PartialOrd ve Copy sınırı gerekir.

3 Çağrı ve T

Kavram Anlamı
en_buyuk(&[3, 9, 2]) i32
en_buyuk(&['a', 'z']) char
en_buyuk(&[1.5, 2.5]) f64
en_buyuk(&[1u8, 7]) u8

Orta seviye bölümündeki tüm dersler