Ich bemerke, dass Rust Atomic*
Strukturen Funktionen haben, die den Wert ändern, wie fetch_add
. Zum Beispiel kann ich dieses Programm schreiben:Warum verwenden die `Atomic *` -Typen von Rust nicht veränderbare Funktionen, um den Wert zu mutieren?
use std::sync::atomic::{AtomicUsize, Ordering};
struct Tester {
counter: AtomicUsize
}
impl Tester {
fn run(&self) {
let counter = self.counter.fetch_add(1, Ordering::Relaxed);
println!("Hi there, this has been run {} times", counter);
}
}
fn main() {
let t = Tester { counter: AtomicUsize::new(0) };
t.run();
t.run();
}
Dies kompiliert und läuft gut, aber wenn ich die AtomicUsize
auf eine normale ganze Zahl ändern, wird es (richtig) scheitern an Veränderlichkeit Bedenken zu kompilieren:
struct Tester {
counter: u64
}
impl Tester {
fn run(&self) {
self.counter = self.counter + 1;
println!("Hi there, this has been run {} times", self.counter);
}
}
Zusätzlich zu Chris Morgans Antwort: Sie können über die so genannte innere Veränderlichkeit [in der offiziellen 'std' Dokumentation] lesen (https://doc.rust-lang.org/std/cell/index.html). 'RefCell' ist ein anderes Beispiel. –