我在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)
右侧的每个东西仍然是知道如何解析特定内容的单独函数.