CodeBlanks Logo Icon CodeBlanks

Özet - Generic'ler

Generic struct, metod ve enum'u birleştirerek bir Pair<T> yazarsın.

Generic'ler özeti

Generic'ler kodu türden bağımsız yazmayı sağlar: fonksiyonlar (fn f<T>), struct'lar (struct S<T>), enum'lar (enum E<T>) ve metotlar (impl<T> S<T>). Trait sınırları T ile ne yapılabileceğini söyler. Somut türe özel impl S<f64> yazılabilir. Tür çıkarılamazsa turbofish ::<T> kullanılır. Monomorfizasyon sayesinde çalışma anı maliyeti yoktur.

Takas fonksiyonu

Hiçbir trait sınırı gerektirmeyen generic'ler de vardır: yalnızca değerleri taşıyan bir fonksiyon T hakkında hiçbir şey bilmek zorunda değildir:

fn takas<T>(c: (T, T)) -> (T, T) {
    (c.1, c.0)
}

println!("{:?}", takas((1, 2)));   // (2, 1)

Ancak {:?} ile yazdırmak çağıran tarafta yapıldığı için orada T: Debug gerekir, fonksiyonun kendisinde değil.

Uygulama Takas

Yukarıdaki fn takas<T>(c: (T, T)) -> (T, T) fonksiyonunu yaz. takas((1, 2)) ve takas(("a", "b")) sonuçlarını {:?} ile boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn takas<T>(c: (T, T)) -> (T, T) {
    (c.1, c.0)
}

fn main() {
    println!("{:?} {:?}", takas((1, 2)), takas(("a", "b")));
}

Beklenen çıktı

(2, 1) ("b", "a")

Soru ve cevaplar

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

1 Generic bir fonksiyon 3 farklı türle çağrılırsa derleyici kaç kopya üretir?

  • 3 Doğru cevap
  • 1
  • Çalışma anında karar verilir
  • 0

Açıklama: Monomorfizasyon her somut tür için ayrı, optimize edilmiş bir sürüm üretir.

2 Sınırsız generic

Soru
fn takas____(c: (T, T)) -> (T, T) {
    (c.1, c.0)
}
Cevap
fn takas<T>(c: (T, T)) -> (T, T) {
    (c.1, c.0)
}

Açıklama: Değerleri yalnızca taşıyan bir fonksiyon için sınır gerekmez.

3 Grubun özeti

Kavram Anlamı
fn f<T>(x: T) Generic fonksiyon
struct S<T> Generic struct
impl<T> S<T> Generic metotlar
::<T> Turbofish

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