"cannot move out of borrowed content" 用于 Vec 但不是 u64
"cannot move out of borrowed content" for Vec but not u64
以下代码抛出错误:
struct Foo {
a: Vec<u64>,
}
impl Foo {
fn change_a(&mut self, new_a: Vec<u64>) {
self.a = *choose(&self.a, &new_a);
}
}
fn choose<'a>(x: &'a Vec<u64>, y: &'a Vec<u64>) -> &'a Vec<u64> {
return if x > y { x } else { y };
}
fn main() {
let mut foo = Foo { a: vec![1] };
foo.change_a(vec![3]);
println!("{:?}", foo.a);
}
错误是:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:7:18
|
7 | self.a = *choose(&self.a, &new_a);
| ^^^^^^^^^^^^^^^^^^^^^^^^ cannot move out of borrowed content
This code works fine 如果我只用 u64
替换 Vec<u64>
。
有什么区别?
区别在于 u64
实现了 Copy
而 Vec<u64>
没有。当您尝试移动实现 Copy
的类型的值但无法移动被移动的值时,编译器实际上不会移动它,而是复制它,这就是 [=10 版本的原因=] 编译正常。
原始类型 u64
实现 Copy
。这意味着 u64
具有 "copy semantics":如果编译器发现我们正在尝试获取 T: Copy
的所有权,但仍在使用正在移动的值,则 T
将被复制.
Vec
不是Copy
,而是Clone
,也就是说我们可以做到
self.a = choose(& self.a, & new_a).clone();
解决这个问题。
Here 是使用您的示例
的另一个复制语义示例
以下代码抛出错误:
struct Foo {
a: Vec<u64>,
}
impl Foo {
fn change_a(&mut self, new_a: Vec<u64>) {
self.a = *choose(&self.a, &new_a);
}
}
fn choose<'a>(x: &'a Vec<u64>, y: &'a Vec<u64>) -> &'a Vec<u64> {
return if x > y { x } else { y };
}
fn main() {
let mut foo = Foo { a: vec![1] };
foo.change_a(vec![3]);
println!("{:?}", foo.a);
}
错误是:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:7:18
|
7 | self.a = *choose(&self.a, &new_a);
| ^^^^^^^^^^^^^^^^^^^^^^^^ cannot move out of borrowed content
This code works fine 如果我只用 u64
替换 Vec<u64>
。
有什么区别?
区别在于 u64
实现了 Copy
而 Vec<u64>
没有。当您尝试移动实现 Copy
的类型的值但无法移动被移动的值时,编译器实际上不会移动它,而是复制它,这就是 [=10 版本的原因=] 编译正常。
原始类型 u64
实现 Copy
。这意味着 u64
具有 "copy semantics":如果编译器发现我们正在尝试获取 T: Copy
的所有权,但仍在使用正在移动的值,则 T
将被复制.
Vec
不是Copy
,而是Clone
,也就是说我们可以做到
self.a = choose(& self.a, & new_a).clone();
解决这个问题。
Here 是使用您的示例
的另一个复制语义示例