为什么引用称为“共享”?

Nur*_*yev 3 terminology reference rust

这是我的最小可复制代码(操场):

struct MyStruct {
    my_string: String,
}

fn accepts_string(my_string: String) {
    println!("my_string: {}", my_string)
}

fn accepts_struct_reference(my_struct: &MyStruct) {
    accepts_string(my_struct.my_string);
}

fn main() {
    let my_struct = MyStruct {
        my_string: String::from("hi"),
    };
    accepts_struct_reference(&my_struct);
}
Run Code Online (Sandbox Code Playgroud)

产生:

struct MyStruct {
    my_string: String,
}

fn accepts_string(my_string: String) {
    println!("my_string: {}", my_string)
}

fn accepts_struct_reference(my_struct: &MyStruct) {
    accepts_string(my_struct.my_string);
}

fn main() {
    let my_struct = MyStruct {
        my_string: String::from("hi"),
    };
    accepts_struct_reference(&my_struct);
}
Run Code Online (Sandbox Code Playgroud)

我相信我理解为什么会发生此错误:accepts_string尝试将字符串从结构中移开。

为什么将该参考称为shared参考?与谁共享?这个形容词是否意味着存在非共享的引用?如果是,它们是什么样的?

Cer*_*rus 6

这是区分可变引用和不可变引用的另一种方法。

生锈,有一个明显的区别:可以对数据进行任何共享(即使他们目前没有共享),直接可变的,但不能是两个同时。这可以通过两种类型的引用来实现:

  • 共享的不可变的,可以复制但不能用于直接对数据进行突变;
  • 唯一的可变的,它们不能被复制(如果您以某种方式执行,则为UB),但可以用来对数据进行突变。

注意“直接可变”位。当然,有时可以通过共享引用来修改数据-如果数据本身允许的话;这就是所谓的内部可变性,它基于多种类型,例如CellMutex,都在内部使用UnsafeCell-唯一允许在共享引用后面进行突变的类型。

可能在此处找到更多信息:https : //limpet.net/mbrubeck/2019/02/07/rust-a-unique-perspective.html

  • @NurbolAlpysbayev:在 1.0 之前的一年,实际上有人将“&mut”重命名为“&uniq”,以强调考虑到内部可变性的存在,重要的是共享与唯一/独占,而不可变/可变是用词不当。它被拒绝了,因为虽然迂腐地正确,但一开始就教授不可变/可变似乎更容易,而且如果人们坚持使用这种语言,他们就会发现真正的本质。我想这意味着你已经通过了初级阶段,恭喜! (2认同)
  • @MatthieuM。谢谢您的见识,这很有趣。我很高兴他们做出这个决定,因为“ uniq”会让我(一个初学者)感到畏缩和困惑。哦,很高兴我不再是初学者,感觉就像我已经通过了一些初始化程序:D (2认同)