CodeBlanks Logo Icon CodeBlanks

Min_const_generics

Min_const_generics sınırlarını ve geçerli kullanım yerlerini öğrenirsin.

Kararlı const generics sınırları

Kararlı Rust'ta (min_const_generics) const parametreler yalnızca tamsayı, bool ve char türünde olabilir. Ayrıca türlerde const parametreli ifadeler kullanılamaz:

fn f<const N: usize>() -> [u8; N] { [0; N] }        // olur
// fn g<const N: usize>() -> [u8; N + 1] { .. }    // hata: genel ifade
// struct S<const AD: &'static str>;               // hata: tür izinli değil

N + 1 gibi ifadeler generic_const_exprs özelliğiyle yalnızca nightly'de mümkündür. Kararlı kodda çözüm genellikle dilime geri dönmek ya da try_into ile çalışma anında dönüştürmektir.

Dilimden diziye

Dilimin ilk N elemanını, uzunluk yeterliyse sabit boyutlu bir dizi olarak almak:

fn ilk_n<const N: usize>(v: &[i32]) -> Option<[i32; N]> {
    v.get(..N)?.try_into().ok()
}

println!("{:?}", ilk_n::<2>(&[5, 6, 7]));   // Some([5, 6])
println!("{:?}", ilk_n::<5>(&[5, 6, 7]));   // None

get(..N) sınır dışında None verir; try_into ise uzunluğu N olan dilimi diziye çevirir.

Uygulama İlk N eleman

Yukarıdaki ilk_n fonksiyonunu yaz. ilk_n::<2>(&[5, 6, 7]) ve ilk_n::<5>(&[5, 6, 7]) sonuçlarını {:?} ile boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn ilk_n<const N: usize>(v: &[i32]) -> Option<[i32; N]> {
    v.get(..N)?.try_into().ok()
}

fn main() {
    println!("{:?} {:?}", ilk_n::<2>(&[5, 6, 7]), ilk_n::<5>(&[5, 6, 7]));
}

Beklenen çıktı

Some([5, 6]) None

Soru ve cevaplar

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

1 Dilimden belirli uzunlukta bir diziye nasıl geçilir?

  • as [T; N]
  • Geçilemez
  • unsafe gerekir
  • <[T; N]>::try_from(dilim) ya da dilim.try_into() Doğru cevap

Açıklama: Uzunluk tutmazsa Err döner; böylece çalışma anı denetimi güvenli kalır.

2 Diziye çevir

Soru
fn ilk_n<const N: usize>(v: &[i32]) -> Option<[i32; N]> {
    v.get(..N)?.____().ok()
}
Cevap
fn ilk_n<const N: usize>(v: &[i32]) -> Option<[i32; N]> {
    v.get(..N)?.try_into().ok()
}

Açıklama: try_into dilimi uzunluk denetimiyle diziye çevirir.

3 Yazım ve kararlı durumu

Kavram Anlamı
<const N: usize> Kararlı
<const B: bool> Kararlı (bool)
[u8; N + 1] Yalnızca nightly
<const S: &str> Desteklenmiyor

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