Rust 为什么生锈';s`Atomic*`类型使用不可变函数来改变值?
我注意到Rust的Rust 为什么生锈';s`Atomic*`类型使用不可变函数来改变值?,rust,Rust,我注意到Rust的原子结构*具有修改值的函数,例如。例如,我可以编写这个程序: use std::sync::atomic::{AtomicUsize, Ordering}; struct Tester { counter: AtomicUsize } impl Tester { fn run(&self) { let counter = self.counter.fetch_add(1, Ordering::Relaxed); pri
原子结构*
具有修改值的函数,例如。例如,我可以编写这个程序:
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);
}
}
如果不是这样的话,它就没有多大用处了。有了
&mut
引用,一次只能存在一个引用,而当时没有&
引用,因此整个操作原子性问题将是没有意义的
另一种看待它的方式是&mut
是唯一引用,而和是可别名引用。对于正常类型,只有当您拥有唯一的引用时,突变才能安全发生,但原子类型都是关于突变(通过替换),而不需要唯一的引用
&
和&mut
的命名一直是一个令人担忧的问题,社区和文档中有很多恐惧、不确定性和怀疑,比如解释事物的实际情况。这种语言最终停留在&
和&mut
上,但是&mut
实际上是关于唯一性而不是易变性的(只是在大多数情况下这两者是等效的)。除了Chris Morgans的回答之外:你可以阅读所谓的内部易变性<代码> ReCys是另一个例子。RIST的“内部可变性”比更常见的是CistasCase C++。也许用(im)易变性来命名它是一个错误的决定。