Özet - Const generics
- Rust kursu
- İleri seviye
- Ders 71/81
- 5 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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<2, 3></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ü
fn devrik(&self) -> Matris____ {
..
}
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 |