Rust'un Atomic*
yapısının fetch_add
gibi değeri değiştiren işlevlere sahip olduğunu fark ettim.Rust'un `Atomic *` türleri neden değeri değiştirmek için değiştirilemeyen işlevler kullanıyor?
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();
}
Bu derler ve iyi çalışır, ancak ben normal tamsayıya AtomicUsize
değiştirirseniz, bu (doğru) nedeniyle mutability endişeleri derlemek başarısız olur:
struct Tester {
counter: u64
}
impl Tester {
fn run(&self) {
self.counter = self.counter + 1;
println!("Hi there, this has been run {} times", self.counter);
}
}
Mesela ben bu programı yazabilir
Chris Morgans'a ek olarak, cevap: iç mekanın mutabilitesini [resmi 'std' belgelerinde] okuyabilirsiniz (https://doc.rust-lang.org/std/cell/index.html). 'RefCell' başka bir örnektir. –