无法摆脱借来的内容 - 参考不起作用

时间:2015-06-22 07:50:14

标签: rust

我有这段代码:

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() };
}

1 个答案:

答案 0 :(得分:3)

简短回答

函数fn2作为参数收到{em>引用 MyEnum1,但Struct1包含拥有的 {{ 1}}。这意味着您实际上是在尝试将引用转换为拥有值,这只有在您复制数据时才有可能。

长答案

如果MyEnum1实施了MyEnum1特征(后者需要实施Copy特征),您的代码就会有用。如果类型实现Clone,则在取消引用它时以及分配它时将自动复制它(例如,标准库中的Copy类型实现i32)。尝试以下内容:

Copy

您也可以选择仅实现#[derive(Clone, Copy)] enum MyEnum1 { val1, val2 } 并明确克隆该对象,以防您的数据结构复制成本高昂(例如,标准库中的Clone结构实现{{1}但不是String)。然后,您需要使用以下代码:

Clone

最后,您还可以选择按值传递Copy,而不是按引用传递。然后,您需要应用的唯一更改是:

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

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