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

标签 rust pattern-matching aliases

<分区>

我正在使用 winit创建一个窗口并通过该窗口获取用户的输入。该窗口创建枚举的变体 Event并将其传递给“回调函数”(我不确定这有多准确)进行处理。

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

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

这可能吗?如果我们也可以以“或”的方式为模式组合命名,那就更好了。

最佳答案

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,
    }
}

关于rust - 我可以在 Rust 中命名一个模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53997708/

相关文章:

logging - 如何使用 log4rs 更改正在运行的进程的日志级别?

rust - "overflow evaluating the requirement"尝试延迟关联类型时

multithreading - 将发送特征添加到装箱特征对象时的奇怪行为

graph - 在图中查找子图

erlang - 为什么 OCaml 的模式匹配比 Erlang 的弱?

rust - 根据参数分配

sql - Oracle 其中 'TEXT' 按一定百分比匹配某些内容

babeljs - 为什么 .eslintrc 可能看不到 .babelrc.js 的别名?

elasticsearch - 为单个 Elasticsearch 索引维护两个别名的用途是什么