borrow ve borrow_mut
- Rust kursu
- Orta seviye
- Ders 37/115
- 4 dk
RefCell'in borrow ve borrow_mut metotlarını kullanırsın.
borrow ve borrow_mut
RefCell her an kaç okuyucu ve yazıcı olduğunu sayar. Bir okuyucu yaşarken borrow_mut() çağırmak panic verir: "already borrowed: BorrowMutError". Panic yerine kontrol etmek için try_borrow ve try_borrow_mut Result döndürür:
let c = RefCell::new(5);
let r1 = c.borrow();
println!("{}", c.try_borrow_mut().is_err()); // true: okuyucu var
drop(r1);
*c.borrow_mut() += 1; // artık serbest
println!("{}", c.borrow()); // 6Sık yapılan hata
Bir Ref'i değişkende tutup aynı kapsamda yazmaya çalışmak, derlenen ama çalışırken çöken kod üretir:
let liste = RefCell::new(vec![1]);
let ilk = liste.borrow(); // okuyucu hâlâ yaşıyor
// liste.borrow_mut().push(2); // panic!
let n = ilk[0];
drop(ilk);
liste.borrow_mut().push(n + 1); // güvenliKural: değeri kopyala ya da ödünç bloğunu süslü parantezle sınırla.
Uygulama Güvenli deneme
RefCell::new(5) oluştur. İç bir blokta borrow() al ve try_borrow_mut().is_err() sonucuyla değeri boşlukla yazdır. Bloktan sonra değeri borrow_mut ile 1 artırıp yazdır.
Başlangıç kodu
use std::cell::RefCell;
fn main() {
// buraya yaz
}Örnek çözüm
use std::cell::RefCell;
fn main() {
let c = RefCell::new(5);
{
let r1 = c.borrow();
let cakisma = c.try_borrow_mut().is_err();
println!("{} {}", *r1, cakisma);
}
*c.borrow_mut() += 1;
println!("{}", c.borrow());
}Beklenen çıktı
5 true 6
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>let a = c.borrow(); let b = c.borrow();</code> ne olur?
- Sorun yok; birden çok okuyucuya izin verilir Doğru cevap
- Panic
- Derleme hatası
- b None olur
Açıklama: Kurallar derleme anı kurallarıyla aynıdır: çok okuyucu serbest, yazıcı tek başına olmalı.
2 Panic'siz deneme
let sonuc = c.____(); // Err(BorrowMutError)
let sonuc = c.try_borrow_mut(); // Err(BorrowMutError)
Açıklama: try_borrow_mut çakışmada panic yerine Err döndürür.
3 Durum ve sonuç
| Kavram | Anlamı |
|---|---|
borrow + borrow |
İzin verilir |
borrow + borrow_mut |
Panic |
borrow + try_borrow_mut |
Err |
drop(r) + borrow_mut |
Çalışır |