rust / intermediate
Snippet
Geteiltes Eigentum mit Rc<T>
Rc<T> (Reference Counting) ermoglicht geteiltes Eigentum an Heap-allokierten Daten in Single-Thread-Kontexten. Anders als Box<T>, wo Eigentum einzigartig ist, erlaubt Rc<T> mehreren Teilen Ihres Codes, dieselben Daten zu besitzen. Die strong_count() Methode gibt zurück, wie viele Rc-Referenzen auf die Daten zeigen. Wenn die letzte Rc verworfen wird, werden die inneren Daten automatisch deallokiert. Rc<T> bietet nur gemeinsamen (unveranderlichen) Zugriff; fur veranderliches geteiltes Eigentum wurden Sie RefCell<T> innerhalb von Rc<T> benotigen. Dies ist nutzlich für Caches, Konfigurationsobjekte oder Daten, auf die von mehreren Stellen zugegriffen werden muss.
snippet.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use std::rc::Rc;#[derive(Debug)]struct Config {name: String,version: String,}fn main() {let config = Rc::new(Config {name: "MyApp".to_string(),version: "1.0.0".to_string(),});println!("Original ref count: {}", Rc::strong_count(&config));{let config_clone = Rc::clone(&config);println!("After clone ref count: {}", Rc::strong_count(&config_clone));println!("Config in scope: {:?}", config_clone);}println!("After scope ref count: {}", Rc::strong_count(&config));let another_clone = Rc::clone(&config);println!("Final ref count: {}", Rc::strong_count(&another_clone));drop(another_clone);println!("After drop ref count: {}", Rc::strong_count(&config));}
Erklärung
1
use std::rc::Rc;
Importiere Rc für Referenz-zauml;hlenden Smart Pointer (nur Single-Thread)
2
#[derive(Debug)]
Leite Debug Trait ab um die Config Struct drucken zu konnen
3
struct Config {
Definiere eine einfache Konfigurationsstruct um geteiltes Eigentum zu demonstrieren
4
let config = Rc::new(Config { ... });
Erstelle initiale Rc die die Config-Daten auf dem Heap wrappt
5
Rc::strong_count(&config)
Erhalte aktuellen Referenzzähler - sollte anfangs 1 sein
6
let config_clone = Rc::clone(&config);
Klonen erstellt neue Rc die auf dieselben Daten zeigt, erhőht Ref-Zahl
7
strong_count gibt 2 zurück
Jetzt zeigen zwei Rc-Instanzen auf dieselben Daten
8
} // config_clone wird hier verworfen
Wenn Clone den Scope verlässt, sinkt Ref-Zahl zurück auf 1
9
let another_clone = Rc::clone(&config);
Erstelle noch einen Clone, Ref-Zahl geht wieder auf 2
10
drop(another_clone);
Verwerfe explizit einen Clone um Ref-Zahl sinken zu sehen
11
strong_count ist wieder 1
Nur originale Rc bleibt, Daten werden freed wenn sie verworfen wird