我可以在 Rust 中命名一个模式吗?

Can I name a pattern in Rust?

我正在使用 winit to create a window and get input from the user through the window. The window creates variants of the enum Event 并将其传递给 "callback function"(我不确定这有多准确)进行处理。

我正在使用匹配语句来决定如何处理事件:

fn process_event(event: winit::Event) -> winit::ControlFlow /*potentially break EventsLoop and exit*/ {
    match event {
        winit::Event::WindowEvent { // match against close request event
            event: winit::WindowEvent::CloseRequested,
            ..
        } => winit::ControlFlow::Break,
        _ => winit::ControlFlow::Continue
    }
}

但是,这很快就会变得非常嘈杂。我目前正在将所有不同的情况拆分成函数,这样我就可以使这段代码更具表现力,但最终,模式仍然如此冗长。如果我能给出一个模式来匹配一个名字,那就太好了,我的意思是这样的:

pattern quitEvent =
    winit::Event::WindowEvent {
        event: winit::WindowEvent::CloseRequested,
        ..
    };

fn process_event(event: winit::Event) -> winit::ControlFlow {
    match event {
        quitEvent => winit::ControlFlow::Break,
        _ => winit::ControlFlow::Continue
    }
}

这可能吗?如果我们也可以以 "or" 的方式为模式组合添加别名,那就更好了。

Rust (1.31) 中没有模式的别名。

虽然有保护子句,但它们可以调用函数:

match event {
    n if is_quit_event(n) => winit::ControlFlow::Break,
    _ => winit::ControlFlow::Continue,
}

因此是可能的,当然您可以在函数内进行任何计算。

这里的函数是:

fn is_quit_event(event: winit::Event) -> bool {
    match event {
        winit::Event::WindowEvent { // match against close request event
            event: winit::WindowEvent::CloseRequested,
            ..
        } => true,
        _ => false,
    }
}