从结构中获取枚举字段:无法移出借来的内容

时间:2015-03-03 23:20:47

标签: rust borrow-checker

我是Rust的新手,并试图围绕所有权/借款概念。现在我已将代码缩减到这个给出编译错误的最小代码示例。

pub struct Display {
    color: Color,
}

pub enum Color {
    Blue         = 0x1,
    Red          = 0x4,
}

impl Display {
    fn get_color_value(&self) -> u16 {
        self.color as u16
    }
}
src/display.rs:12:9: 12:13 error: cannot move out of borrowed content
src/display.rs:12         self.color as u16
                          ^~~~
error: aborting due to previous error
Could not compile.

我仍然在所有内容都按价值心态进行复制,在self.color完全合法,因为这样会得到Color的副本。显然,我错了。我在SO上发现了一些关于同样错误的其他问题,但没有解决我的问题。

据我了解,该字段由拥有Display的任何人拥有。因为我只借了一个 引用Display,我不拥有它。提取color尝试转移所有权 我Color,这是不可能的,因为我不拥有Display。这是对的吗?

我该如何解决?

1 个答案:

答案 0 :(得分:11)

  

我仍然在所有的东西中被价值心态所复制,它在哪里   做self.color是完全合法的,因为那会给我一份Color。   显然,我错了。我发现了一些关于同样的问题   SO上的错误,但我的问题无法解决。

任何可以在rust中复制的东西都必须与特征Copy明确地混在一起。 Copy在过去是隐含的,但已被更改(rfc)。

  

据我了解,该字段由拥有显示器的任何人拥有。   由于我只是借用了人工显示器的参考资料,所以我并不拥有它。   提取颜色尝试将Color的所有权转让给我,   这是不可能的,因为我不拥有显示器。这是对的吗?

是。当您遇到此错误时,有三种可能的解决方案:

  • 为类型(如果适用)导出特征Copy
  • 使用/导出Cloneself.color.clone()
  • 返回参考

要解决此问题,您需要为Copy

派生Color
#[derive(Copy, Clone)]
pub enum Color {
    Blue         = 0x1,
    Red          = 0x4,
}

这与:

相同
impl Copy for Color {}