[T; N]
- Rust kursu
- İleri seviye
- Ders 66/81
- 4 dk
Const parametreli generic türleri öğrenirsin.
[T; N]
Const generic'ler, türleri ve fonksiyonları bir değerle parametreleştirmeyi sağlar. En yaygın kullanımı dizi uzunluğudur: [T; N]'deki N artık generic olabilir:
fn toplam<const N: usize>(a: [i32; N]) -> i32 {
a.iter().sum()
}
struct Tampon<const N: usize> {
veri: [u8; N],
}
impl<const N: usize> Tampon<N> {
fn new() -> Self {
Self { veri: [0; N] }
}
}toplam([1, 2, 3]) çağrısında N = 3 çıkarılır. Her farklı N için ayrı bir kopya derlenir (monomorfizasyon).
Değer türün parçasıdır
Tampon<4> ve Tampon<8> farklı türlerdir; birinin beklendiği yere diğeri verilemez. Boyut derleme anında bilindiği için heap ayırması gerekmez ve sınır denetimleri çoğu zaman tamamen kaldırılır:
let a: Tampon<4> = Tampon::new();
let b = Tampon::<8>::new();
println!("{} {}", a.veri.len(), b.veri.len()); // 4 8Matrisler, sabit boyutlu tamponlar, ağ protokol çerçeveleri ve kriptografi blokları tipik kullanım alanlarıdır.
Uygulama Sabit boyutlu diziler
Yukarıdaki toplam fonksiyonunu ve Tampon<const N: usize> türünü yaz. toplam([1, 2, 3]), toplam([10; 4]) ve Tampon::<8>::new().veri.len() sonuçlarını boşlukla yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn toplam<const N: usize>(a: [i32; N]) -> i32 {
a.iter().sum()
}
struct Tampon<const N: usize> {
veri: [u8; N],
}
impl<const N: usize> Tampon<N> {
fn new() -> Self {
Self { veri: [0; N] }
}
}
fn main() {
println!("{} {} {}", toplam([1, 2, 3]), toplam([10; 4]), Tampon::<8>::new().veri.len());
}Beklenen çıktı
6 40 8
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Const generic'ler gelmeden önce diziler için trait uygulamaları nasıl yazılırdı?
- Yazılamazdı
- Vec'e çevirerek
- Makrolarla 0..=32 arası her uzunluk için ayrı ayrı Doğru cevap
- Tek bir uygulamayla
Açıklama: Bu yüzden eski Rust'ta 33 elemanlı bir dizi Debug yazdıramıyordu; const generic'ler bu sınırı kaldırdı.
2 Değer parametresi
fn toplam<____>(a: [i32; N]) -> i32 {
a.iter().sum()
}
fn toplam<const N: usize>(a: [i32; N]) -> i32 {
a.iter().sum()
}
Açıklama: Const generic parametre const AD: TÜR biçiminde bildirilir.
3 Çağrı ve N
| Kavram | Anlamı |
|---|---|
toplam([1, 2, 3]) |
N = 3 |
toplam([10; 4]) |
N = 4 |
Tampon::<8>::new() |
N = 8 |
toplam([]) |
N = 0 |