2016-06-07 128 views
4

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

cannot move out of type [Enum; 2] , a non-copy fixed-size array

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

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

+1

为什么downvote?请解释它是一个好主意。 – Boiethios

+3

我没有倒下,但长期用户很少解释downvotes,因为他们经历了生气的OPs报复和投票报复。我认为大多数人都赞成异或评论。 – Shepmaster

+0

你确定它是'(grid [i] [0])+ grid [i] [1] + grid [i] [2]/3',而不是'(grid [i] [0] + grid [i ] [1] + grid [i] [2])/ 3'? – kennytm

回答

4

较小的再现:

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, 
} 

where is the copy needed?

这是一个很好的问题,我不完全知道为什么值被强制转换为整数时需要移动。这与阵列没有任何具体关系:

#[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 
} 
+0

谢谢您的简约再现,我试图做到这一点,但仍然有太多的线条:p并且您的解决方案有效。是否有可能通过网格作为参考,而不是复制它? – Boiethios

+0

@Boiethios *可能通过网格作为参考* - 你已经这样做:'&Grid' – Shepmaster

+1

我不明白需要复制的地方? – Boiethios