10

我是 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. 它是否正确?

我该如何解决?

4

1 回答 1

12

我仍然处于价值思维模式所复制的一切之中,在这种情况下,执行 self.color 是完全合法的,因为这会给我一份 Color 的副本。显然,我错了。我在 SO 上发现了一些关于同样错误的其他问题,但没有解决我的问题。

任何可以在 rust 中复制的东西都必须明确地带有 trait CopyCopy过去是隐含的,但后来改变了(rfc)。

据我了解,该字段归拥有显示器的人所有。由于我只是借用了对显示器的引用,因此我不拥有它。提取颜色试图将颜色的所有权转移给我,这是不可能的,因为我不拥有显示器。它是否正确?

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

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

为了解决这个问题,你Copy得出Color

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

这与以下内容相同:

impl Copy for Color {}
于 2015-03-03T23:22:49.137 回答