2017-03-27 31 views
0

下面的代碼拋出錯誤:「不能搬出借來的內容」爲VEC但不是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如果我只需更換Vec<u64>小號u64 s。

有什麼區別?

+1

也許是與向量元素的生命週期是從載體本身分開?即每個向量elem需要至少與'self.a'一樣長。 –

回答

2

原始類型u64執行Copy。這意味着u64具有「複製語義」:如果編譯器發現我們嘗試獲取T: Copy的所有權,但仍然使用從中移出的值,則將複製T

VecCopy,但它是Clone,這意味着我們可以做

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

要解決這個問題。

Here使用拷貝語義的另一個例子您的例子

2

區別在於u64實現了CopyVec<u64>沒有。當您嘗試移動一個實現了Copy的類型的值,但被移動的值無法移動時,編譯器不會實際移動它,但會將其複製,這就是爲什麼u64版本編譯正常的原因。

相關問題