CodeBlanks Logo Icon CodeBlanks

Özet - İleri trait'ler

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

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

Örnek çözüm

main.rs
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ü

Soru
impl Graf for KomsulukListesi {
    type ____ = usize;
    ..
}
Cevap
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

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