CodeBlanks Logo Icon CodeBlanks

Const trait bound

Const generics ile trait sınırı kullanmayı öğrenirsin.

Const parametreli türler ve trait'ler

Const parametreli türler trait uygulayabilir ve trait sınırlarına konabilir. Boyut türün parçası olduğu için boyut uyuşmazlığı derleme hatasıdır; çalışma anı denetimi gerekmez:

struct Vektor<const N: usize>([f64; N]);

impl<const N: usize> Vektor<N> {
    fn nokta(&self, o: &Self) -> f64 {
        self.0.iter().zip(o.0.iter()).map(|(a, b)| a * b).sum()
    }
}

let a = Vektor([1.0, 2.0, 3.0]);
let b = Vektor([4.0, 5.0, 6.0]);
println!("{}", a.nokta(&b));                // 32
// a.nokta(&Vektor([1.0, 2.0]));            // hata: Vektor<3> bekleniyor

Trait uygulamak

Tüm boyutlar için tek bir trait uygulaması yazılabilir:

impl<const N: usize> Default for Vektor<N> {
    fn default() -> Self {
        Vektor([0.0; N])
    }
}

impl<const N: usize> std::ops::Add for Vektor<N> {
    type Output = Self;
    fn add(self, o: Self) -> Self {
        let mut t = [0.0; N];
        for i in 0..N { t[i] = self.0[i] + o.0[i]; }
        Vektor(t)
    }
}

Uygulama Nokta çarpımı

Yukarıdaki Vektor<const N: usize> türünü ve nokta metodunu yaz. Vektor([1.0, 2.0, 3.0]) ile Vektor([4.0, 5.0, 6.0]) nokta çarpımını yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
struct Vektor<const N: usize>([f64; N]);

impl<const N: usize> Vektor<N> {
    fn nokta(&self, o: &Self) -> f64 {
        self.0.iter().zip(o.0.iter()).map(|(a, b)| a * b).sum()
    }
}

fn main() {
    let a = Vektor([1.0, 2.0, 3.0]);
    let b = Vektor([4.0, 5.0, 6.0]);
    println!("{}", a.nokta(&b));
}

Beklenen çıktı

32

Soru ve cevaplar

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

1 <code>Vec&lt;f64&gt;</code> tabanlı bir vektörle aynı hata nasıl yakalanırdı?

  • Yalnızca çalışma anında, uzunluk karşılaştırmasıyla Doğru cevap
  • Derleme anında
  • Yakalanamazdı
  • Tür denetimiyle

Açıklama: Const generic, bir değişmezi tür sistemine taşır; hata kullanıcıya program çalışmadan önce gösterilir.

2 Tüm boyutlar için

Soru
impl____ Default for Vektor<N> {
    fn default() -> Self {
        Vektor([0.0; N])
    }
}
Cevap
impl<const N: usize> Default for Vektor<N> {
    fn default() -> Self {
        Vektor([0.0; N])
    }
}

Açıklama: impl bloğu const parametreyi de bildirmelidir.

3 İfade ve sonuç

Kavram Anlamı
Vektor([1.0, 2.0, 3.0]).nokta(&b) 32
Vektor<3> · Vektor<2> Derleme hatası
Vektor::<4>::default() [0.0; 4]
Vektor<2> + Vektor<2> Vektor<2>

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