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

问题描述 投票:3回答:1

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

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);
}

产生:

error[E0507]: cannot move out of `my_struct.my_string` which is behind a shared reference
  --> src/main.rs:10:20
   |
10 |     accepts_string(my_struct.my_string);
   |                    ^^^^^^^^^^^^^^^^^^^ move occurs because `my_struct.my_string` has type `std::string::String`, which does not implement the `Copy` trait

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

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

reference rust terminology
1个回答
6
投票
这是区分可变和不可变引用的另一种方法。

在Rust中,有一个明显的区别:数据可以是[[任一可共享的(即使它们当前未共享),

或是直接可变的,但不能一次全部共享。这可以通过两种类型的引用来实现:

    shared
  • immutable,可以复制但不能用于直接突变数据;
  • unique
  • mutable
  • 的那些,无法复制(如果您以某种方式执行,则为UB),但可以用来对数据进行突变。请注意“直接可变”位。当然,有时可以通过共享引用来修改数据-如果数据本身允许的话;这就是所谓的

    内部可变性

    ,基于CellMutex等多种类型,它们都在内部使用UnsafeCell-唯一允许在共享引用后面进行显式突变的类型。可能在这里找到更多信息:https://limpet.net/mbrubeck/2019/02/07/rust-a-unique-perspective.html
    © www.soinside.com 2019 - 2024. All rights reserved.