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
,您绝对应该
#[派生(复制,克隆)]
。因为它只能是一个纯整数,所以没有理由不复制它们。