Associated type
- Rust kursu
- İleri seviye
- Ders 60/81
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
impl Kap for Liste {
type ____ = String;
fn al(&self, i: usize) -> Option<&String> { self.0.get(i) }
}
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ı |