【问题标题】:Get an enum field from a struct: cannot move out of borrowed content从结构中获取枚举字段:不能移出借来的内容
【发布时间】:2015-03-03 23:20:47
【问题描述】:

我是 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。这是正确的吗?

我该如何解决?

【问题讨论】:

    标签: rust borrow-checker


    【解决方案1】:

    我还在被价值观念复制的一切,它在哪里 做 self.color 完全合法,因为这会给我一份 Color 的副本。 显然,我错了。我发现了一些关于这个的其他问题 SO上的错误,但我的问题没有解决方案。

    任何可以在 rust 中复制的东西都必须明确地使用 trait CopyCopy 过去是隐含的,但现在已更改 (rfc)。

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

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

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

    要解决这个问题,您需要为Color 派生Copy

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

    这与:

    impl Copy for Color {}
    

    【讨论】:

    • 我们应该使用#[derive(Copy, Clone)],因为Copy 具有Clone 作为超级特征(如this answer 中所述)
    • @TaThanhDinh 谢谢,已修复。不确定我回答这个问题时是否是这种情况。
    • 我刚刚遇到了这个问题,除了枚举是在另一个 crate 中定义的,所以我没有为它派生任何东西,我该怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2016-01-16
    • 1970-01-01
    相关资源
    最近更新 更多