Const trait bound
- Rust kursu
- İleri seviye
- Ders 68/81
- 4 dk
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> bekleniyorTrait 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
fn main() {
// buraya yaz
}Örnek çözüm
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<f64></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
impl____ Default for Vektor<N> {
fn default() -> Self {
Vektor([0.0; N])
}
}
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> |