以下代码会引发错误:
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如果我用Vec<u64>
替换u64
s。
有什么区别?
答案 0 :(得分:2)
不同之处在于u64
实现了Copy
而Vec<u64>
没有实现Copy
。当您尝试移动实现u64
的类型的值但移动的值无法移动时,编译器实际上不会移动它,而是会复制它,这就是{{1编译好。
答案 1 :(得分:2)
原始类型u64
实现Timer Operator。这意味着u64
具有&#34;复制语义&#34;:如果编译器发现我们尝试取得T: Copy
的所有权,但仍然使用了移动的值,{{1}将被复制。
T
不是Vec
,而是Copy
,这意味着我们可以
Clone
解决此问题。
Delay是使用示例
的复制语义的另一个示例