以下代码引发错误:

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)。

有什么区别?

最佳答案

基本类型u64实现 Copy 。这意味着u64具有“复制语义”:如果编译器发现我们正试图获得T: Copy的所有权,但仍使用从中移出的值,则会复制T
Vec不是Copy,但它是Clone,这意味着我们可以

self.a = choose(& self.a, & new_a).clone();

要解决此问题。

Here是使用您的示例的复制语义的另一个示例

关于compiler-errors - Vec的“cannot move out of borrowed content”而不是u64,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43037583/

10-09 04:00