如何在Rust中的变量中存储模式?

Bre*_*ung 8 rust

我在Rust中实现了一个解析器,而空白是我想在match模式中重用的常见模式.

此代码有效:

let ch = ' ';

match ch {
    ' ' | '\n' | '\t' | '\r' => println!("whitespace"),
     _ => println!("token"),
}
Run Code Online (Sandbox Code Playgroud)

如果我每次都需要继续指定空白模式,这将变得非常重复.我想定义一次并重用它.我想做的事情如下:

let whitespace = ' ' | '\n' | '\t' | '\r';

let ch = ' ';

match ch {
    whitespace => println!("whitespace"),
    _          => println!("token"),
}
Run Code Online (Sandbox Code Playgroud)

编译器不喜欢ws赋值.它将其解释|为二进制运算而不是交替运算.

模式可以以某种方式存储在变量中吗?有没有更好或更惯用的方法来做到这一点?

She*_*ter 13

模式可以以某种方式存储在变量中吗?

编号模式是编译时构造,变量包含运行时概念.

有没有更好或更惯用的方法来做到这一点?

创建函数或方法始终是避免重复代码的好方法.然后,您可以将其用作保护条款:

fn is_whitespace(c: char) -> bool {
    match c {
        ' ' | '\n' | '\t' | '\r' => true,
        _ => false,
    }
}

fn main() {
    let ch = ' ';

    match ch {
        x if is_whitespace(x) => println!("whitespace"),
        _ => println!("token"),
    }
}
Run Code Online (Sandbox Code Playgroud)

我也强烈建议使用现有的解析器,其中有很多,但每个人都希望他们的Rust"hello world"能够解析,无论出于何种原因.

我使用的解析库允许编写类似于此的代码,其中whitespace一个函数知道如何解析有效的空白类型:

sequence!(pm, pt, {
    _          = literal("if");
    ws         = whitespace;
    _          = literal("let");
    ws         = append_whitespace(ws);
    pattern    = pattern;
    ws         = optional_whitespace(ws);
    _          = literal("=");
    ws         = optional_whitespace(ws);
    expression = expression;
}, |_, _| /* do something with pieces */);
Run Code Online (Sandbox Code Playgroud)

右侧的每个东西仍然是知道如何解析特定内容的单独函数.