CodeBlanks Logo Icon CodeBlanks

borrow ve borrow_mut

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());                   // 6

Sı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üvenli

Kural: 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

main.rs
use std::cell::RefCell;

fn main() {
    // buraya yaz
}

Örnek çözüm

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

Soru
let sonuc = c.____();   // Err(BorrowMutError)
Cevap
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

Orta seviye bölümündeki tüm dersler