Borrow checker
- Rust kursu
- Uzman
- Ders 4/46
- 4 dk
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ırBu 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
fn main() {
// buraya yaz
}Örnek çözüm
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ç
let mut v = vec![1, 2];
v.push(v.____()); // [1, 2, 2]
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 |