为什么引用名为 "shared"?
Why is a reference called "shared"?
这是我的最小可重现代码 (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
引用?与谁共享?该形容词是否表示存在非共享引用?如果有,它们长什么样?
这是区分可变引用和不可变引用的另一种方式。
在 Rust 中,有一个明显的区别:数据可以 或者 共享(即使它们当前没有共享),或者 直接可变,但不能同时改变。这是通过有两种类型的引用来实现的:
- shared,或者immutable,可以复制,但不能用来直接变异数据;
- unique,或 mutable,无法复制(这是 UB,如果你以某种方式这样做),但可以用于改变数据。
注意 "directly mutable" 位。当然,有时可以通过共享引用修改数据——如果数据本身允许的话;这就是所谓的 内部可变性 ,基于 Cell
或 Mutex
等多种类型,它们都在内部使用 UnsafeCell
- 唯一明确允许的类型在共享引用之后发生变异。
可以在此处找到更多信息:https://limpet.net/mbrubeck/2019/02/07/rust-a-unique-perspective.html
这是我的最小可重现代码 (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
引用?与谁共享?该形容词是否表示存在非共享引用?如果有,它们长什么样?
这是区分可变引用和不可变引用的另一种方式。
在 Rust 中,有一个明显的区别:数据可以 或者 共享(即使它们当前没有共享),或者 直接可变,但不能同时改变。这是通过有两种类型的引用来实现的:
- shared,或者immutable,可以复制,但不能用来直接变异数据;
- unique,或 mutable,无法复制(这是 UB,如果你以某种方式这样做),但可以用于改变数据。
注意 "directly mutable" 位。当然,有时可以通过共享引用修改数据——如果数据本身允许的话;这就是所谓的 内部可变性 ,基于 Cell
或 Mutex
等多种类型,它们都在内部使用 UnsafeCell
- 唯一明确允许的类型在共享引用之后发生变异。
可以在此处找到更多信息:https://limpet.net/mbrubeck/2019/02/07/rust-a-unique-perspective.html