capypad
0 Tage Serie
rust / intermediate
Snippet

Innere Veränderlichkeit mit Rc<RefCell<T>>

Rc<RefCell<T>> ermöglicht innere Veränderlichkeit in Rust und erlaubt die Mutation von Daten, selbst wenn es mehrere unveränderliche Referenzen gibt. Rc bietet Referenzzählung für gemeinsame Besitzverhältnisse, während RefCell die Borrow-Prüfung auf die Laufzeit verschiebt. Dieses Muster ist nützlich, wenn Sie Veränderlichkeit hinter einer unveränderlichen Schnittstelle benötigen.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use std::cell::RefCell;
use std::rc::Rc;
 
fn main() {
let shared: Rc<RefCell<Vec<i32>>> = Rc::new(RefCell::new(vec![1, 2, 3]));
let ref1 = Rc::clone(&shared);
let ref2 = Rc::clone(&shared);
ref1.borrow_mut().push(4);
println!("Shared contents: {:?}", ref2.borrow());
shared.borrow_mut().push(5);
println!("Final contents: {:?}", shared.borrow());
}
Erklärung
1
use std::cell::RefCell
Importiert RefCell, das innere Veränderlichkeit mit Laufzeit-Borrow-Prüfung bietet
2
use std::rc::Rc
Importiert Rc für Referenz-zählende gemeinsame Besitzverhältnisse
3
let shared = Rc::new(RefCell::new(vec![1, 2, 3]))
Erstellt einen RefCell-umschlossenen Vektor, der in Rc für gemeinsame Besitzverhältnisse eingewickelt ist
4
let ref1 = Rc::clone(&shared)
Klont das Rc, erhöht den Referenzzähler und erstellt eine weitere Referenz auf dieselben Daten
5
ref1.borrow_mut().push(4)
Erwirbt eine veränderliche Ausleihe und pusht 4 durch ref1 in den Vektor
6
println!("{:?}", ref2.borrow())
Greift durch ref2 auf die Inhalte zu und zeigt, dass die Mutation für alle Referenzen sichtbar ist