CodeBlanks Logo Icon CodeBlanks

Özet - Const generics

const fn ve [T; N]'i birleştirerek generic bir dot product yazarsın.

Const generics özeti

Const generic'ler türleri değerlerle parametreleştirir: struct S<const N: usize>, fn f<const N: usize>. Boyut türün parçasıdır; uyuşmazlık derleme hatasıdır ve heap gerekmez. const fn derleme anında hesap yapar. Kararlı Rust'ta parametreler tamsayı/bool/char ile sınırlıdır ve türlerde N + 1 gibi ifadeler kullanılamaz. Dilim ↔ dizi geçişi için try_into, sabit parçalar için chunks_exact.

Boyutlu matris

İki const parametreyle boyutları türde taşıyan bir matris:

struct Matris<const R: usize, const C: usize>([[i32; C]; R]);

impl<const R: usize, const C: usize> Matris<R, C> {
    fn devrik(&self) -> Matris<C, R> {
        let mut t = [[0; R]; C];
        for i in 0..R {
            for j in 0..C {
                t[j][i] = self.0[i][j];
            }
        }
        Matris(t)
    }
}

Çarpım da imzada denetlenir: fn carp<const K: usize>(&self, o: &Matris<C, K>) -> Matris<R, K>.

Uygulama Matris devriği

Yukarıdaki Matris<const R: usize, const C: usize> türünü ve devrik metodunu yaz. Matris([[1, 2, 3], [4, 5, 6]]) için devriğin iç dizisini {:?} ile yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
struct Matris<const R: usize, const C: usize>([[i32; C]; R]);

impl<const R: usize, const C: usize> Matris<R, C> {
    fn devrik(&self) -> Matris<C, R> {
        let mut t = [[0; R]; C];
        for i in 0..R {
            for j in 0..C {
                t[j][i] = self.0[i][j];
            }
        }
        Matris(t)
    }
}

fn main() {
    let m = Matris([[1, 2, 3], [4, 5, 6]]);
    println!("{:?}", m.devrik().0);
}

Beklenen çıktı

[[1, 4], [2, 5], [3, 6]]

Soru ve cevaplar

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

1 <code>Matris&lt;2, 3&gt;</code>'ün devriği hangi türdedir?

  • Vec<Vec<i32>>
  • Matris<3, 2> Doğru cevap
  • Matris<2, 3>
  • Matris<6>

Açıklama: Satır ve sütun sayıları yer değiştirir; tür sistemi bunu imzada ifade eder: fn devrik(&self) -> Matris<C, R>.

2 Devrik türü

Soru
fn devrik(&self) -> Matris____ {
    ..
}
Cevap
fn devrik(&self) -> Matris<C, R> {
    ..
}

Açıklama: Devrik, satır ve sütun sayısını yer değiştirir.

3 Grubun özeti

Kavram Anlamı
<const N: usize> Değer parametresi
const fn Derleme anı hesap
try_into Dilim → dizi
Matris<R, C> Boyutlu tür

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