对于Vec而言,“不能摆脱借来的内容”,而不是u64

时间:2017-03-27 03:39:52

标签: compiler-errors rust borrow-checker

以下代码会引发错误:

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。

有什么区别?

2 个答案:

答案 0 :(得分:2)

不同之处在于u64实现了CopyVec<u64>没有实现Copy。当您尝试移动实现u64的类型的值但移动的值无法移动时,编译器实际上不会移动它,而是会复制它,这就是{{1编译好。

答案 1 :(得分:2)

原始类型u64实现Timer Operator。这意味着u64具有&#34;复制语义&#34;:如果编译器发现我们尝试取得T: Copy的所有权,但仍然使用了移动的值,{{1}将被复制。

T不是Vec,而是Copy,这意味着我们可以

Clone

解决此问题。

Delay是使用示例

的复制语义的另一个示例