【问题标题】:I do not understand error E0508我不明白错误 E0508
【发布时间】:2016-06-07 13:32:45
【问题描述】:

当我试图编译这段代码时,我得到了 E0508​​ 错误:

无法移出[Enum; 2] 类型,一个非复制的固定大小数组

enum Enum {
    Val1 = 0,
    Val2 = 1,
}

fn main() {
    let a = [Enum::Val1, Enum::Val2];
    let x: i32 = a[0] as i32 + a[1] as i32;
    println!("{}", x);
}

我只想访问枚举类型数组中的单个值。

【问题讨论】:

  • 为什么投反对票?请解释一下是个好主意。
  • 我没有投反对票,但长期用户很少解释投反对票,因为他们经历过愤怒的 OP 进行报复并投反对票。我认为大多数人不赞成 XOR 评论。
  • 你确定是(grid[i][0]) + grid[i][1] + grid[i][2] / 3,而不是(grid[i][0] + grid[i][1] + grid[i][2]) / 3
  • 好吧,那很遗憾,我不会从错误中吸取教训......
  • @kennytm 我不知道,这是另一个问题。我目前正在尝试修复它。

标签: rust


【解决方案1】:

较小的复制品:

enum Enum {
    Val1 = 0,
    Val2 = 1,
}

fn main() {
    let a = [Enum::Val1];
    a[0] as i32;
}

最简单的解决方法是让你的枚举Copy:

#[derive(Copy, Clone)]
enum Enum {
    Val1 = 0,
    Val2 = 1,
}

副本在哪里?

这是一个很好的问题,我不完全确定为什么在强制转换为整数时需要移动该值。不过,这与数组无关:

#[derive(Debug)]
enum Enum {
    Val1 = 0,
    Val2 = 1,
}

fn main() {
    let a = Enum::Val1;
    let b = a as i32;
    println!("{:?}", a); // Error: a was moved in the line above
}

【讨论】:

  • 感谢您的极简复制,我尝试这样做,但仍然有太多行 :p 您的解决方案有效。是否可以将网格作为参考传递,而不复制它?
  • @Boiethios 可以将网格作为参考传递 - 你已经这样做了:&Grid
  • 我不明白哪里需要复制?
  • 好的。因此,当转换一个值时,编译器会尝试以某种方式移动它。在这个例子中,我首先认为它试图创建一个i32 类型的新(临时)变量。但不:它想移动变量,然后重新解释它。奇怪。
  • @Boiethios 对;请注意,被复制或移动的是 enum,而不是数组,因此复制或移动绝对是​​正确的行为(并且不能使用引用进行优化,因为 int32 可能小于指针)。是的,我相信 Rust 默认使所有类型都可移动,并且默认情况下更喜欢移动而不是副本,我认为这是有道理的(C++ 的“复制幸福”遇到了奇怪的问题;例如 std::function 必须始终是可复制的,这意味着它永远无法捕获唯一的指针)。
猜你喜欢
  • 1970-01-01
  • 2016-10-09
  • 2019-07-26
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多