2015-06-22 53 views
2

我有這樣的代碼:不能搬出借來的內容 - 裁判不起作用

enum MyEnum1 { 
    val1, 
    val2 
} 

struct Struct1 { 
    field1: MyEnum1, 
    field2: String 
} 

fn fn1(a: Struct1, b: String, c: String) { 
    let let1 = fn2(&a.field1); 
} 


fn fn2(a: &MyEnum1) { 
    let a11 = *a; // error 
    let s = Struct1 { field1: a11, field2: "fdsfds".to_string() }; 
} 

fn main() { 
    println!("Hello World!"); 
} 

的錯誤是錯誤:不能搬出借來的內容

我被編譯器建議要使用refref mut,我試圖使用它們,但仍然沒有幫助。

fn fn2(a: &MyEnum1) { 
    let ref a11 = *a; // still the error 
    let s = Struct1 { field1: *a11, field2: "fdsfds".to_string() }; 
} 
+0

實際的錯誤現在在下一行,而不是在您添加的'仍然error'評論 –

+0

@ker,沒有行..... .. –

+1

解決方案是實現複製,問題是關於「不能移出借用的內容」,我認爲這是非常重複的 –

回答

3

簡短的回答

功能fn2收到參考MyEnum1作爲參數,但Struct1包含擁有MyEnum1。這意味着您實際上正在嘗試將引用轉換爲擁有的值,這隻有在您複製數據時纔有可能。如果MyEnum1實施Copy特徵(這又需要實施Clone性狀)

龍答案

您的代碼會工作。如果某個類型實現了Copy,則在您取消引用它時以及分配它時(例如,標準庫中的i32類型實現了Copy),它將自動複製。你可以試試下面的:

#[derive(Clone, Copy)] 
enum MyEnum1 { 
    val1, 
    val2 
} 

您也可以選擇只Clone落實,並明確克隆對象,如果你的數據結構是複製昂貴的(例如,String結構標準庫實現Clone但不是Copy)。然後,你需要使用下面的代碼:

#[derive(Clone)] 
enum MyEnum1 { 
    val1, 
    val2 
} 

fn fn2(a: &MyEnum1) { 
    let s = Struct1 { field1: a.clone(), field2: "fdsfds".to_string() }; 
} 

最後,您還可以選擇按值傳遞的MyEnum1,而不是按引用。然後,你需要申請唯一的變化是:

fn fn1(a: Struct1, b: String, c: String) { 
    let let1 = fn2(a.field1); 
} 

fn fn2(a: MyEnum1) { 
    let s = Struct1 { field1: a, field2: "fdsfds".to_string() }; 
} 
相關問題