8
我注意到Rust的Atomic*
結構具有修改該值的功能,例如fetch_add
。舉例來說,我可以這樣寫程序:爲什麼Rust的`Atomic *`類型使用非可變函數來改變該值?
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();
}
這編譯和運行正常,但如果我改變AtomicUsize
正常整數,它會(正確地)無法編譯由於可變性的擔憂:
struct Tester {
counter: u64
}
impl Tester {
fn run(&self) {
self.counter = self.counter + 1;
println!("Hi there, this has been run {} times", self.counter);
}
}
除了Chris Morgans的回答:你可以在官方的'std'文檔(https://doc.rust-lang.org/std/cell/index.html)上看到所謂的內部可變性。 'RefCell'是另一個例子。 –