我是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
。这是对的吗?
我该如何解决?
答案 0 :(得分:11)
我仍然在所有的东西中被价值心态所复制,它在哪里 做self.color是完全合法的,因为那会给我一份Color。 显然,我错了。我发现了一些关于同样的问题 SO上的错误,但我的问题无法解决。
任何可以在rust中复制的东西都必须与特征Copy
明确地混在一起。 Copy
在过去是隐含的,但已被更改(rfc)。
据我了解,该字段由拥有显示器的任何人拥有。 由于我只是借用了人工显示器的参考资料,所以我并不拥有它。 提取颜色尝试将Color的所有权转让给我, 这是不可能的,因为我不拥有显示器。这是对的吗?
是。当您遇到此错误时,有三种可能的解决方案:
Copy
Clone
(self.color.clone()
)要解决此问题,您需要为Copy
Color
#[derive(Copy, Clone)]
pub enum Color {
Blue = 0x1,
Red = 0x4,
}
这与:
相同impl Copy for Color {}