Bounds check
- Rust kursu
- Uzman
- Ders 17/46
- 4 dk
Bounds check ve önleme yöntemlerini öğrenirsin.
Bounds check
Her v[i] erişimi bir sınır denetimi içerir; panic yerine tanımsız davranışı önleyen budur. Çoğu zaman maliyeti ölçülemeyecek kadar küçüktür ve derleyici, indeksin sınırlar içinde olduğunu kanıtlayabildiğinde denetimi kaldırır. Kanıtı kolaylaştırmanın yolları:
// 1) yineleyici kullan: denetim yok
for x in v.iter() { .. }
// 2) zip ile iki dilimi birlikte dolaş
a.iter().zip(b).map(|(x, y)| x * y).sum::<f64>()
// 3) uzunluğu baştan doğrula: döngüdeki denetimler kalkar
assert_eq!(a.len(), b.len());
for i in 0..a.len() { t += a[i] * b[i]; }Assert ile denetimi öne almak
Döngüden önce yapılan tek bir denetim, döngü içindeki n denetimin yerini alabilir: derleyici i < a.len() ve a.len() == b.len() bilgisinden b[i]'nin de güvenli olduğunu çıkarır. Fonksiyonun sözleşmesini belgelemenin de iyi bir yoludur:
fn nokta(a: &[f64], b: &[f64]) -> f64 {
assert_eq!(a.len(), b.len(), "uzunluklar farklı");
a.iter().zip(b).map(|(x, y)| x * y).sum()
}Uygulama Nokta çarpımı
Yukarıdaki nokta fonksiyonunu yaz. nokta(&[1.0, 2.0], &[3.0, 4.0]) sonucunu yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn nokta(a: &[f64], b: &[f64]) -> f64 {
assert_eq!(a.len(), b.len(), "uzunluklar farklı");
a.iter().zip(b).map(|(x, y)| x * y).sum()
}
fn main() {
println!("{}", nokta(&[1.0, 2.0], &[3.0, 4.0]));
}Beklenen çıktı
11
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>get_unchecked</code> ne zaman meşrudur?
- Profil denetimin önemli olduğunu gösterdiyse ve indeksin geçerliliği başka yolla kanıtlıysa Doğru cevap
- Her zaman
- Hiçbir zaman
- Debug derlemede
Açıklama: Önce güvenli yollar (yineleyici, zip, assert) denenmeli; unsafe son çaredir.
2 Birlikte dolaş
a.iter().____(b).map(|(x, y)| x * y).sum::<f64>()
a.iter().zip(b).map(|(x, y)| x * y).sum::<f64>()
Açıklama: zip iki yineleyiciyi eşleştirir ve indeks denetimi gerektirmez.
3 Erişim ve sınır denetimi
| Kavram | Anlamı |
|---|---|
v[i] |
Denetimli, panic |
v.get(i) |
Denetimli, Option |
v.iter() |
Denetim yok |
get_unchecked(i) |
unsafe, denetim yok |