CodeBlanks Logo Icon CodeBlanks

Bounds check

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

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

Örnek çözüm

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

Soru
a.iter().____(b).map(|(x, y)| x * y).sum::<f64>()
Cevap
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

Uzman bölümündeki tüm dersler