Zauważam, że struktury Rusta Atomic*
mają funkcje modyfikujące wartość, takie jak fetch_add
. Na przykład, mogę napisać ten program:Dlaczego typy Rusta `Atomic *` używają niemodulujących funkcji do mutowania wartości?
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();
}
To kompiluje i działa poprawnie, ale jeśli mogę zmienić AtomicUsize
do normalnej liczby całkowitej, to będą (prawidłowo) nie skompilować ze względu na zmienność dotyczy:
struct Tester {
counter: u64
}
impl Tester {
fn run(&self) {
self.counter = self.counter + 1;
println!("Hi there, this has been run {} times", self.counter);
}
}
Oprócz odpowiedzi Chrisa Morgana: można przeczytać o tzw. Zmienności wnętrza [w oficjalnej dokumentacji 'std' (https://doc.rust-lang.org/std/cell/index.html). "RefCell" to kolejny przykład. –