Struct 如何强制转换结构中的字段枚举?
为什么施法者会从借来的内容中移出Struct 如何强制转换结构中的字段枚举?,struct,enums,casting,rust,Struct,Enums,Casting,Rust,为什么施法者会从借来的内容中移出self #[derive(Debug)] enum Foo { One = 1, Two = 2, } struct Bar { f: Foo, } impl Bar { fn bar(&mut self) { println!("{:?}", self.f); // "Two" println!("{:?}", Foo::Two as u8); // "2" print
self
#[derive(Debug)]
enum Foo {
One = 1,
Two = 2,
}
struct Bar {
f: Foo,
}
impl Bar {
fn bar(&mut self) {
println!("{:?}", self.f); // "Two"
println!("{:?}", Foo::Two as u8); // "2"
println!("{:?}", self.f as u8); // error
}
}
fn main() {
Bar{f: Foo::Two}.bar();
}
抛出此错误:
错误[E0507]:无法移出借用的内容
-->src/main.rs:15:26
|
15 | println!(“{:?}”,self.f作为u8);//错误
|^^^^无法移出借用的内容
我在官方资料中找不到任何关于它的信息,但似乎因为
强制转换具有移动语义,即它们使用强制转换对象;考虑这个缩短的情况:
#[derive(Debug)]
enum Foo {
Foo1 = 1
}
fn main() {
let foo = Foo::Foo1;
let bar = foo as u8; // the cast moves foo
println!("{:?}", bar); // ok
println!("{:?}", foo); // error[E0382]: use of moved value: `foo`
}
在您的情况下,您可变地借用了self
,因此无法使用(即移动);如果您将签名更改为bar(self)
,或者通过派生Clone
和Copy
使Foo可复制,那么它将起作用。对于Foo
,您绝对应该#[派生(复制,克隆)]
。因为它只能是一个纯整数,所以没有理由不复制它们。