CodeBlanks Logo Icon CodeBlanks

[T; N]

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 8

Matrisler, 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

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

Örnek çözüm

main.rs
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

Soru
fn toplam<____>(a: [i32; N]) -> i32 {
    a.iter().sum()
}
Cevap
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

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