CodeBlanks Logo Icon CodeBlanks

RefCell<T>

RefCell<T> ile çalışma zamanı ödünç almayı öğrenirsin.

RefCell<T>

Ödünç alma kuralları normalde derleme anında denetlenir. RefCell<T> aynı kuralları çalışma anında denetler; böylece değiştirilemez bir referans arkasındaki veri bile değiştirilebilir. Buna interior mutability (iç değiştirilebilirlik) denir:

use std::cell::RefCell;

let c = RefCell::new(vec![1, 2]);   // c mut değil!
c.borrow_mut().push(3);
println!("{:?}", c.borrow());       // [1, 2, 3]

Kurallar aynıdır (ya çok okuyucu ya tek yazıcı); fark, ihlalin derleme hatası yerine panic olmasıdır.

Ref ve RefMut

borrow() bir Ref<T>, borrow_mut() bir RefMut<T> döndürür. Bunlar kapsamdan çıkınca ödünç kaydı silinir. Bu yüzden ödünçleri kısa tutmak önemlidir:

let c = RefCell::new(String::from("a"));
c.borrow_mut().push('b');      // geçici RefMut, satır sonunda biter
let uzunluk = c.borrow().len();  // yeni bir okuma
println!("{uzunluk}");           // 2

Uygulama Değiştirilemez değişkende değişiklik

let c = RefCell::new(vec![1, 2]); (mut olmadan) tanımla. borrow_mut ile 3 ekle; sonra borrow ile vektörü ve uzunluğunu boşlukla 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(vec![1, 2]);
    c.borrow_mut().push(3);
    println!("{:?} {}", c.borrow(), c.borrow().len());
}

Beklenen çıktı

[1, 2, 3] 3

Soru ve cevaplar

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

1 RefCell ne zaman tercih edilir?

  • Hiçbir zaman
  • Derleyicinin kanıtlayamadığı ama senin güvenli olduğunu bildiğin değiştirmelerde Doğru cevap
  • Her zaman, daha hızlı olduğu için
  • Thread'ler arası paylaşımda

Açıklama: RefCell küçük bir çalışma anı maliyeti taşır ve tek thread içindir; thread'ler arası karşılığı Mutex'tir.

2 Yazma ödüncü

Soru
let c = RefCell::new(vec![1, 2]);
c.____().push(3);
Cevap
let c = RefCell::new(vec![1, 2]);
c.borrow_mut().push(3);

Açıklama: borrow_mut çalışma anında denetlenen değiştirilebilir bir ödünç verir.

3 Yöntem ve dönüşü

Kavram Anlamı
c.borrow() Ref<T>
c.borrow_mut() RefMut<T>
İki borrow_mut aynı anda Panic
c.into_inner() T (sahiplik)

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