CodeBlanks Logo Icon CodeBlanks

Rc<T>

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));   // 2

Rc::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));       // 1

Rc 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

main.rs
use std::rc::Rc;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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&lt;T&gt;</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ş

Soru
let a = Rc::new(String::from("x"));
let b = Rc::____(&a);
Cevap
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

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