【问题标题】:How can I structure/destructure an enum of enums?如何构造/解构枚举的枚举?
【发布时间】:2018-07-05 10:02:00
【问题描述】:

我在匹配枚举枚举时遇到了问题。结构类似这样:

enum WebEvent {
    PageLoad,
    PageUnload,
    KeyPress(char),
    Paste(String),
    Click { x: i64, y: i64 },
}
enum KeyEvent {
    UpPressed,
    DownPressed,
}

enum Event {
    WebEvent,
    KeyEvent,
}

fn inspect(event: Event) {
    match event {
        Event::WebEvent::PageLoad => println!("page loaded"),
        Event::WebEvent::PageUnload => println!("page unloaded"),
        Event::WebEvent::KeyPress(c) => println!("pressed '{}'.", c),
        Event::WebEvent::Paste(s) => println!("pasted \"{}\".", s),
        Event::WebEvent::Click { x, y } => {
            println!("clicked at x={}, y={}.", x, y);
        }
        Event::KeyEvent => {
            println!("got a key event");
        }
    }
}

fn main() {
    let pressed = WebEvent::KeyPress('x');
    inspect(pressed);
}

playground

这是我从编译器得到的错误:

error[E0433]: failed to resolve. Not a module `WebEvent`
  --> src/main.rs:20:16
   |
20 |         Event::WebEvent::PageLoad => println!("page loaded"),
   |                ^^^^^^^^ Not a module `WebEvent`

error[E0433]: failed to resolve. Not a module `WebEvent`
  --> src/main.rs:21:16
   |
21 |         Event::WebEvent::PageUnload => println!("page unloaded"),
   |                ^^^^^^^^ Not a module `WebEvent`

error[E0433]: failed to resolve. Not a module `WebEvent`
  --> src/main.rs:22:16
   |
22 |         Event::WebEvent::KeyPress(c) => println!("pressed '{}'.", c),
   |                ^^^^^^^^ Not a module `WebEvent`

error[E0433]: failed to resolve. Not a module `WebEvent`
  --> src/main.rs:23:16
   |
23 |         Event::WebEvent::Paste(s) => println!("pasted \"{}\".", s),
   |                ^^^^^^^^ Not a module `WebEvent`

error[E0433]: failed to resolve. Not a module `WebEvent`
  --> src/main.rs:24:16
   |
24 |         Event::WebEvent::Click { x, y } => {
   |                ^^^^^^^^ Not a module `WebEvent`

error[E0308]: mismatched types
  --> src/main.rs:35:13
   |
35 |     inspect(pressed);
   |             ^^^^^^^ expected enum `Event`, found enum `WebEvent`
   |
   = note: expected type `Event`
              found type `WebEvent`

构造/解构枚举枚举的正确方法是什么?有什么办法可以做到这一点吗?

【问题讨论】:

    标签: enums rust


    【解决方案1】:

    您忘记了枚举变体不是类型 - 您需要引入包装器才能使枚举能够包含其他枚举:

    enum Event {
        WebEvent(WebEvent),
        KeyEvent(KeyEvent)
    }
    

    剩下的就很简单了:

    enum WebEvent {
        PageLoad,
        PageUnload,
        KeyPress(char),
        Paste(String),
        Click { x: i64, y: i64 },
    }
    
    enum KeyEvent {
        UpPressed,
        DownPressed,
    }
    
    enum Event {
        WebEvent(WebEvent),
        KeyEvent(KeyEvent)
    }
    
    fn inspect(event: Event) {
        if let Event::WebEvent(webevt) = event {
            match webevt {
                WebEvent::PageLoad => println!("page loaded"),
                WebEvent::PageUnload => println!("page unloaded"),
                WebEvent::KeyPress(c) => println!("pressed '{}'.", c),
                WebEvent::Paste(s) => println!("pasted \"{}\".", s),
                WebEvent::Click { x, y } => println!("clicked at x={}, y={}.", x, y)
            }
        } else {
            println!("got a key event")
        }
    }
    
    fn main() {
        let pressed = Event::WebEvent(WebEvent::KeyPress('x')); // note the extra wrap here
        inspect(pressed);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 2011-07-03
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 2020-10-28
      相关资源
      最近更新 更多