此代码不能编译:
fn main() {
let x = "".to_string();
let y = &x;
let z = *y;
}
编译器错误输出为:
无法移出共享引用后面的
*y
之所以发生移动,是因为
*y
具有类型String
,该类型不实现Copy
特征
我不太清楚这里发生了什么,我正在寻找一个解释.
我原以为会有z
人拥有String
和x
,而y
会变得无法使用.
此代码不能编译:
fn main() {
let x = "".to_string();
let y = &x;
let z = *y;
}
编译器错误输出为:
无法移出共享引用后面的
*y
之所以发生移动,是因为
*y
具有类型String
,该类型不实现Copy
特征
我不太清楚这里发生了什么,我正在寻找一个解释.
我原以为会有z
人拥有String
和x
,而y
会变得无法使用.
let z = *y;
这条线只知道y
,而y
是&String
.&String
没有携带任何它来自哪里的信息,它只携带了它引用String
的信息.它既不知道也不关心x
包含实际内容这一事实,也不对x
有任何控制,只是borrow 判断器确保x
保持在作用域内且不可变.
所以*y
实际上不会产生x
,而是一个匿名的String
值,只能通过引用访问,这意味着它可以被使用,但不能被拥有.
通过做z = *y
,你就是在试图拥有引用背后的价值.但正如我所说的,这将需要修改x
(因为它以后不再有效),而y
没有超过x
的权力.所以这是不可能的.
因为z = *y
不是可复制类型的问题,因为它们不需要所有权转移,而只是被复制,所以Rust告诉您这是不可能的,因为y
引用的值不实现Copy
.