CodeBlanks Logo Icon CodeBlanks

Borrow checker

Borrow checker'ın MIR üzerinde nasıl çalıştığını öğrenirsin.

Borrow checker

Ödünç denetleyicisi MIR üzerinde çalışır ve üç şeyi denetler: her referansın gösterdiği değerden uzun yaşamadığını (ömürler), aynı anda çakışan &mut erişim olmadığını ve taşınmış ya da başlatılmamış bir değerin kullanılmadığını. Bazı durumlarda kuralları kod yazımına uygun hale getiren ince düzenlemeler vardır; örneğin iki aşamalı ödünç (two-phase borrows):

let mut v = vec![1, 2];
v.push(v.len());   // &mut v alınır ama "etkinleşmesi" argüman hesaplandıktan sonradır

Bu olmasaydı, v.len() için gereken &v ile push'un &mut v'si çakışırdı.

Polonius

Bugünkü denetleyicinin reddettiği ama aslında güvenli olan bazı programlar vardır. En bilineni, bir haritadan bulduğunu döndürüp bulamadığında ekleme yapan desendir. Yeni nesil denetleyici Polonius bu durumları kabul edecek şekilde tasarlanmıştır; o gelene kadar entry API'si ya da iki aşamalı arama kullanılır:

// bugünkü çözüm: entry ile tek arama
let deger = harita.entry(anahtar).or_insert_with(|| hesapla());

Uygulama İki aşamalı ödünç

let mut v = vec![1, 2]; için v.push(v.len()); çalıştır ve vektörü {:?} ile yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn main() {
    let mut v = vec![1, 2];
    v.push(v.len());
    println!("{:?}", v);
}

Beklenen çıktı

[1, 2, 2]

Soru ve cevaplar

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

1 Ödünç denetleyicisi bir hata bulduğunda programın çalışma süresine etkisi nedir?

  • Bellek artar
  • Hiçbiri; tüm denetim derleme anındadır, çalışma anı maliyeti yoktur Doğru cevap
  • Program yavaşlar
  • Çalışma anında denetim eklenir

Açıklama: Ödünç denetimi tamamen statik bir analizdir; RefCell gibi çalışma anı denetimi yalnızca açıkça seçildiğinde vardır.

2 İki aşamalı ödünç

Soru
let mut v = vec![1, 2];
v.push(v.____());   // [1, 2, 2]
Cevap
let mut v = vec![1, 2];
v.push(v.len());   // [1, 2, 2]

Açıklama: Argüman önce hesaplanır, &mut ödünç sonra etkinleşir.

3 Denetim ve hata kodu

Kavram Anlamı
Taşınmış değer kullanımı E0382
Çakışan &mut E0499
Okurken yazma E0502
Kısa yaşayan değer E0597

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