简体   繁体   English

如何构造/分解枚举的枚举?

[英]How can I structure/destructure an enum of enums?

I am running into issues when matching on an enum of enums. 在枚举匹配时出现问题。 The structure is similar to this: 结构类似于此:

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 操场

This is the error I get from the compiler: 这是我从编译器得到的错误:

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`

What is the right way to structure/destructure an enum of enums? 什么是构造/分解枚举的正确方法? Is there any way I can do this? 有什么办法可以做到吗?

You forgot that enum variants are not types - you need to introduce wrappers in order for an enum to be able to contain other enums: 您忘记了枚举变量不是类型-您需要引入包装器才能使枚举能够包含其他枚举:

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

The rest is pretty straightforward: 其余的非常简单:

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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM