Rc<T>
- Rust kursu
- Orta seviye
- Ders 31/115
- 4 dk
Rc<T> ile paylaşılan sahiplik öğrenirsin.
Rc<T>
Bazen bir değerin birden çok sahibi olması gerekir: örneğin bir graf düğümünü birçok kenar paylaşır. Rc<T> (reference counted) sahip sayısını tutar; son sahip bırakılınca değer de bırakılır:
use std::rc::Rc;
let a = Rc::new(String::from("paylaşılan"));
let b = Rc::clone(&a); // derin kopya değil, sayaç +1
println!("{}", Rc::strong_count(&a)); // 2Rc::clone yalnızca sayacı artırır, veriyi kopyalamaz. a.clone() da aynı şeyi yapar ama Rc::clone(&a) yazımı bunun ucuz bir işlem olduğunu açıkça gösterir.
Sayaç ve kapsam
Her Rc kopyası kapsamdan çıktığında sayaç azalır:
let a = Rc::new(5);
{
let _c = Rc::clone(&a);
println!("{}", Rc::strong_count(&a)); // 2
}
println!("{}", Rc::strong_count(&a)); // 1Rc tek iş parçacıklıdır; sayaç atomik olmadığı için başka bir thread'e gönderilemez (Send değildir). Thread'ler arasında paylaşmak için Arc gerekir.
Uygulama Paylaşılan metin
Rc::new(String::from("paylaşılan")) oluştur ve bir kopya al. İç bir blokta bir kopya daha alıp sayacı yazdır; bloktan sonra sayacı ve metni boşlukla yazdır.
Başlangıç kodu
use std::rc::Rc;
fn main() {
// buraya yaz
}Örnek çözüm
use std::rc::Rc;
fn main() {
let a = Rc::new(String::from("paylaşılan"));
let _b = Rc::clone(&a);
{
let _c = Rc::clone(&a);
println!("{}", Rc::strong_count(&a));
}
println!("{} {}", Rc::strong_count(&a), a);
}Beklenen çıktı
3 2 paylaşılan
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>Rc<T></code> içindeki değer değiştirilebilir mi?
- Doğrudan hayır; Rc yalnızca paylaşılan (&T) erişim verir Doğru cevap
- Evet, her sahip değiştirebilir
- Yalnızca ilk sahip
- mut Rc ile evet
Açıklama: Birden çok sahip aynı anda değiştirirse ödünç alma kuralları bozulurdu. Değiştirmek için Rc<RefCell<T>> kullanılır.
2 Sahipliği paylaş
let a = Rc::new(String::from("x"));
let b = Rc::____(&a);
let a = Rc::new(String::from("x"));
let b = Rc::clone(&a);
Açıklama: Rc::clone sayacı artırır ve aynı veriye yeni bir sahip verir.
3 İşlem ve sayaç
| Kavram | Anlamı |
|---|---|
Rc::new(x) |
1 |
+ Rc::clone(&a) |
2 |
+ bir kopya daha |
3 |
Hepsi bırakılınca |
Değer silinir |