【问题标题】:cannot move out of borrowed content - ref doesn't work [duplicate]无法移出借来的内容 - ref 不起作用 [重复]
【发布时间】:2015-06-22 07:50:14
【问题描述】:

我有这个代码:

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

【问题讨论】:

  • 实际上错误现在在下一行,而不是在您添加still the error评论的那一行
  • 解决办法是复制,问题是“不能搬出借来的内容”,我觉得这很重复

标签: rust


【解决方案1】:

简答

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

【讨论】:

    猜你喜欢
    • 2019-08-29
    • 1970-01-01
    • 2018-04-04
    • 2016-09-15
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    相关资源
    最近更新 更多