在枚举匹配时出现问题。结构类似于此:
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);
}
Run Code Online (Sandbox Code Playgroud)
这是我从编译器得到的错误:
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);
}
Run Code Online (Sandbox Code Playgroud)
什么是构造/分解枚举的正确方法?有什么办法可以做到吗?
您忘记了枚举变量不是类型-您需要引入包装器才能使枚举能够包含其他枚举:
enum Event {
WebEvent(WebEvent),
KeyEvent(KeyEvent)
}
Run Code Online (Sandbox Code Playgroud)
其余的非常简单:
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);
}
Run Code Online (Sandbox Code Playgroud)