2015-06-22 31 views
0

我的代码:错误:使用移动的值 - 我应该使用“&”还是“mut”或其他?

enum MyEnum1 { 
    //.... 
} 

struct Struct1 { 
    field1: MyEnum1, 
    field2: String 
} 

fn fn1(a: Struct1, b: String, c: String) -> String { 
    let let1 = fn2(a.field1); 
    let let2 = fn3(let1, b, c); 
    format!("{} something 123 {}", let1, let2) 
} 


fn fn2(a: MyEnum1) -> String { 
    //.... 
} 

fn fn3(a: MyEnum1, b: Struct1) -> String { 
    //.... 
} 


error: use of moved value: `a.field1` 
error: use of moved value: `let1` 

我怎样才能解决这些问题?我应该添加&到'fn2 and fn3 ? Or mut`的参数吗?我无法理解如何解决这类错误的想法。

+1

您的代码会产生与您所描述的不同的错误,请提供一个工作示例 –

+1

您的代码不一致。 'fn3'声明不同意它是如何被调用的。这段代码会给你输入错误,而不是所有权。请使你的代码[一个可编译的例子](http://stackoverflow.com/help/mcve)。 –

回答

4

这些错误来自Rust-ownership中最重要的概念。您应该阅读the official book,特别是关于ownership的章节 - 这将帮助您了解“如何解决这类错误”。

总之,特别是在代码中,问题是,String是非复制的类型,也就是,传递给函数或分配给本地变量时String值不复制,它们移动。这意味着无论他们以前在哪里,他们都无法从那里进入。

让我们看一下你的函数:

enum MyEnum1 { 
    //.... 
} 

struct Struct1 { 
    field1: MyEnum1, 
    field2: String 
} 

fn fn1(a: Struct1, b: String, c: String) -> String { 
    let let1 = fn2(a.field1); 
    let let2 = fn3(let1, b, c); 
    format!("{} something 123 {}", let1, let2) 
} 

fn fn2(a: MyEnum1) -> String { 
    //.... 
} 

这里所有类型都不会自动可拷贝(不执行Copy性状)。 String不可复制,因为它是一个堆分配的字符串,复制需要一个新的分配(一个昂贵的操作,最好不要隐式),MyEnum1不可复制,因为它没有实现Copy(例如#[deriving(Copy, Clone)];它是不清楚它是否可以复制,因为你没有提供它的变体),并且Struct1不可复制,因为它包含不可复制的类型。

fn1你调用fn2,传递它field1并得到String回来。然后,您立即将此String传递给fn3。因为String不可复制,所以let1中存储的任何内容都是,将转移到被调用函数中,使得let1不可访问。这就是“使用移动值”的错误所在。 (您提供的代码不能导致“使用移动的值:a.field1”错误,因此它可能来自您省略的部分,但基本思路完全相同)

有几种方法可以修复这些错误,但最自然和最普通的一个确实是使用借来的参考。一般来说,如果你只想读一个函数的一些不可复制的价值,你应该有它传递引用:

fn use_myenum(e: &MyEnum1) 

对于字符串和数组,但是,更好的方式是通过切片:

fn use_str(s: &str) { ... } 

let s: String = ...; 
use_str(&s); // here &String is automatically converted to &str 

你可以在书中找到更多关于切片的文章,here

+0

谢谢,这就是我需要的。有一件事:我如何在'fn use_myenum(e:&MyEnum1)'中删除'e' - 从指针转换为“正常”MyEnum1? –

+0

因为当我尝试使用'* e'时,即使这是您正在寻找的答案,我也会收到“错误:无法移出借来的内容” –

+1

,如果您更新问题以包含[MCVE](http://stackoverflow.com/help/mcve) –

相关问题