为什么强制转换将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();
}

引发此错误:

error[E0507]: cannot move out of borrowed content
  --> src/main.rs:15:26
   |
15 |         println!("{:?}", self.f as u8); // error
   |                          ^^^^ cannot move out of borrowed content

最佳答案

我在官方资料中找不到任何有关它的信息,但是as强制转换似乎具有移动语义,即它们消耗了强制转换对象。考虑这种缩短的情况:

#[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)或通过派生FooClone使Copy可复制,那么它将起作用。

关于struct - 如何在结构内部强制转换为字段的枚举?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44289831/

10-13 04:36