CodeBlanks Logo Icon CodeBlanks

Associated type

Trait ile ilişkili tür (associated type) tanımlamayı öğrenirsin.

Associated type

İlişkili tür, trait'in içinde adı geçen ve her uygulamanın bir kez belirlediği bir tür yer tutucusudur. Iterator::Item en bilinen örnektir:

trait Kap {
    type Oge;
    fn al(&self, i: usize) -> Option<&Self::Oge>;
}

struct Liste(Vec<String>);

impl Kap for Liste {
    type Oge = String;
    fn al(&self, i: usize) -> Option<&String> {
        self.0.get(i)
    }
}

Generic parametreyle (trait Kap<T>) farkı: bir tür trait'i yalnızca bir kez uygulayabilir ve kullanırken türü yazmak gerekmez.

İlişkili türle sınır

Generic kodda ilişkili türe T::Oge diye erişilir ve sınır konabilir:

fn ilk_yaz<K>(k: &K)
where
    K: Kap,
    K::Oge: std::fmt::Debug,
{
    println!("{:?}", k.al(0));
}

// belirli bir eleman türü isteyen sınır:
fn metinler<K: Kap<Oge = String>>(k: &K) { .. }

Uygulama Kap trait'i

Yukarıdaki Kap trait'ini ve Liste uygulamasını yaz. Liste(vec!["a".into(), "b".into()]) için al(1) ve al(5) sonuçlarını {:?} ile boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
trait Kap {
    type Oge;
    fn al(&self, i: usize) -> Option<&Self::Oge>;
}

struct Liste(Vec<String>);

impl Kap for Liste {
    type Oge = String;
    fn al(&self, i: usize) -> Option<&String> {
        self.0.get(i)
    }
}

fn main() {
    let l = Liste(vec!["a".into(), "b".into()]);
    println!("{:?} {:?}", l.al(1), l.al(5));
}

Beklenen çıktı

Some("b") None

Soru ve cevaplar

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

1 Ne zaman ilişkili tür yerine generic parametre seçilir?

  • Her zaman
  • Hiçbir zaman
  • Performans için
  • Bir türün trait'i birden çok tür için uygulaması anlamlıysa (From<T> gibi) Doğru cevap

Açıklama: String hem From<&str> hem From<char> uygular; bir yineleyicinin ise tek bir Item türü vardır.

2 İlişkili türü belirle

Soru
impl Kap for Liste {
    type ____ = String;
    fn al(&self, i: usize) -> Option<&String> { self.0.get(i) }
}
Cevap
impl Kap for Liste {
    type Oge = String;
    fn al(&self, i: usize) -> Option<&String> { self.0.get(i) }
}

Açıklama: Uygulama, trait'te bildirilen ilişkili türü belirler.

3 Yazım ve anlamı

Kavram Anlamı
type Oge; Bildirim
type Oge = String; Uygulamada belirleme
K::Oge Generic kodda erişim
Kap<Oge = String> Eşitlik sınırı

İleri seviye bölümündeki tüm dersler