capypad
0 Tage Serie
rust / intermediate
Snippet

Innere Veränderlichkeit mit Cell-Typen

Cell-Typen ermöglichen mutable Datenteilung in Singlethread-Szenarien wo Borrow-Regeln normalerweise dagegen sprechen würden. Cell<T> funktioniert nur mit Copy-Typen und bietet set und get Methoden. RefCell<T> umschließt jeden Typ und verfolgt Borrow-Checks zur Laufzeit statt zur Kompilierzeit, und paniced wenn Borrow-Regeln verletzt werden. Nutze diese wenn du innere Veränderlichkeit brauchst aber Singlethread-Zugriff garantieren kannst.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use std::cell::Cell;
use std::cell::RefCell;
 
fn main() {
let data = Cell::new(5);
data.set(10);
println!("Cell value: {}", data.get());
let ref_data = RefCell::new(vec![1, 2, 3]);
ref_data.borrow_mut().push(4);
println!("RefCell: {:?}", ref_data.borrow());
let mut count = 5;
let counter = Cell::new(count);
count = 10;
println!("Counter unchanged: {}", counter.get());
}
Erklärung
1
let data = Cell::new(5)
Erstellt eine Cell mit i32. Cell<T> funktioniert nur mit Copy-Typen wie i32, bool, char
2
data.set(10)
Cell erlaubt Mutation selbst durch geteilte Referenz weil es intern Zugriff verwaltet
3
ref_data.borrow_mut().push(4)
borrow_mut gibt mutable Referenz zurück und ermöglicht Mutation. Borrow-Tracker stellt sicher dass nur eine mutable Borrow gleichzeitig existiert
4
count = 10; println!("{}", counter.get())
Ändern von count beeinflusst Cell nicht da Cell für Copy-Typen seine eigene Kopie speichert