Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么生锈';s`Atomic*`类型使用不可变函数来改变值?_Rust - Fatal编程技术网

Rust 为什么生锈';s`Atomic*`类型使用不可变函数来改变值?

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

我注意到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);
        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)易变性来命名它是一个错误的决定。