rust / intermediate
Snippet
Innere Veränderlichkeit mit RefCell<T>
RefCell<T> bietet innere Veränderlichkeit, indem es die Ausleihenprüfung von der Kompilierzeit auf die Laufzeit verlagert. Während Ref<T> und RefMut<T> die Ausleihregeln zur Laufzeit durchsetzen, ermöglicht RefCell<T> die Mutation des inneren Werts selbst durch unveränderliche Referenzen. Dieses Muster ist nützlich, wenn Sie Daten von mehreren Stellen aus mutieren müssen, aber Ausleihentscheidungen verzögern möchten. Das Verletzen von Ausleihregeln führt jedoch zu einem Panic zur Laufzeit anstatt zu einem Kompilierfehler.
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
use std::cell::RefCell;struct Counter {value: RefCell<i32>,}impl Counter {fn new() -> Self {Counter { value: RefCell::new(0) }}fn increment(&self) {*self.value.borrow_mut() += 1;}fn get(&self) -> i32 {*self.value.borrow()}}fn main() {let counter = Counter::new();counter.increment();counter.increment();println!("Count: {}", counter.get());}
Erklärung
1
use std::cell::RefCell;
Importiert RefCell aus dem cell-Modul für Muster innerer Veränderlichkeit
2
value: RefCell<i32>
Umschließt i32 mit RefCell, um Mutation durch &self zu ermöglichen
3
*self.value.borrow_mut() += 1;
borrow_mut() gibt einen RefMut<i32> zurück, der dereferenziert wird, um den inneren Wert zu ändern
4
*self.value.borrow()
borrow() gibt einen unveränderlichen Ref<i32> zurück, um den Wert sicher zu lesen