Özet - İleri trait'ler
- Rust kursu
- İleri seviye
- Ders 65/81
- 5 dk
Associated type ve supertrait'i birleştirerek bir Graph trait'i yazarsın.
İleri trait'ler özeti
İlişkili türler (type Oge;) bir uygulamanın bir kez seçtiği türlerdir; ilişkili sabitler (const N: u32;) türe ait derleme anı değerleridir. GAT'lar ilişkili türe ömür ya da tür parametresi ekler. Üst trait'ler (trait A: B) bağımlılık bildirir. Newtype deseni yetim kuralını aşar ve tür güvenliği sağlar. Bu araçlar birlikte, graf gibi soyut yapıları türden bağımsız tanımlamayı sağlar.
Graf trait'i
Algoritmalar trait üzerinden yazılınca her graf gösterimiyle (komşuluk listesi, matris) çalışır:
trait Graf {
type Dugum;
fn komsular(&self, d: &Self::Dugum) -> Vec<Self::Dugum>;
fn kenar_sayisi(&self) -> usize;
}
struct KomsulukListesi(Vec<Vec<usize>>);
impl Graf for KomsulukListesi {
type Dugum = usize;
fn komsular(&self, d: &usize) -> Vec<usize> {
self.0[*d].clone()
}
fn kenar_sayisi(&self) -> usize {
self.0.iter().map(|k| k.len()).sum()
}
}Uygulama Graf
Yukarıdaki Graf trait'ini ve KomsulukListesi uygulamasını yaz. vec![vec![1, 2], vec![2], vec![0]] grafı için 0 düğümünün komşularını ({:?}) ve kenar sayısını boşlukla yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
trait Graf {
type Dugum;
fn komsular(&self, d: &Self::Dugum) -> Vec<Self::Dugum>;
fn kenar_sayisi(&self) -> usize;
}
struct KomsulukListesi(Vec<Vec<usize>>);
impl Graf for KomsulukListesi {
type Dugum = usize;
fn komsular(&self, d: &usize) -> Vec<usize> {
self.0[*d].clone()
}
fn kenar_sayisi(&self) -> usize {
self.0.iter().map(|k| k.len()).sum()
}
}
fn main() {
let g = KomsulukListesi(vec![vec![1, 2], vec![2], vec![0]]);
println!("{:?} {}", g.komsular(&0), g.kenar_sayisi());
}Beklenen çıktı
[1, 2] 4
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir <code>Graf</code> trait'inde düğüm türü neden ilişkili tür olmalıdır?
- Performans için
- Gerekmez
- Her graf yapısının tek bir düğüm türü vardır ve kullanırken yazılması gerekmez Doğru cevap
- Generic yasaktır
Açıklama: fn yol<G: Graf>(g: &G, a: G::Dugum) gibi imzalar sade kalır; generic parametreyle Graf<D> her yerde D gerektirirdi.
2 Düğüm türü
impl Graf for KomsulukListesi {
type ____ = usize;
..
}
impl Graf for KomsulukListesi {
type Dugum = usize;
..
}
Açıklama: Uygulama ilişkili düğüm türünü usize olarak belirler.
3 Grubun özeti
| Kavram | Anlamı |
|---|---|
type X; |
İlişkili tür |
const N: u32; |
İlişkili sabit |
trait A: B |
Üst trait |
struct W(T); |
Newtype |