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

Dan*_*ker 9 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
    }
}
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)

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

据我了解,该领域由拥有者的所有者拥有Display.由于我只借用了一个参考Display,我不拥有它.提取color转移Color给我的所有权的尝试,这是不可能的,因为我没有拥有Display.它是否正确?

我该如何解决?

Arj*_*jan 11

我仍然在所有的东西被价值心态复制,在那里做self.color是完全合法的,因为这会得到我的Color副本.显然,我错了.我在SO上发现了一些关于同样错误的其他问题,但没有解决我的问题.

任何可以在铁锈中复制的东西都必须明确地与特征混合Copy.Copy在过去是隐含的但是改变了(rfc).

据我了解,该领域由拥有显示器的任何人拥有.由于我只借用了显示器的引用,我不拥有它.提取颜色尝试将颜色的所有权转移给我,这是不可能的,因为我没有显示.它是否正确?

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

  • 导出Copy类型的特征(如果适用)
  • 使用/ derive Clone(self.color.clone())
  • 返回参考

为了解决这个问题,你得到CopyColor:

#[derive(Copy, Clone)]
pub enum Color {
    Blue         = 0x1,
    Red          = 0x4,
}
Run Code Online (Sandbox Code Playgroud)

这与:

impl Copy for Color {}
Run Code Online (Sandbox Code Playgroud)