Min_const_generics
- Rust kursu
- İleri seviye
- Ders 69/81
- 4 dk
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ğilN + 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])); // Noneget(..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
fn main() {
// buraya yaz
}Örnek çözüm
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
fn ilk_n<const N: usize>(v: &[i32]) -> Option<[i32; N]> {
v.get(..N)?.____().ok()
}
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 |