RefCell<T>
- Rust kursu
- Orta seviye
- Ders 36/115
- 4 dk
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}"); // 2Uygulama 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
use std::cell::RefCell;
fn main() {
// buraya yaz
}Örnek çözüm
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ü
let c = RefCell::new(vec![1, 2]);
c.____().push(3);
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) |