Can patterns be stored in variables somehow?
No. Patterns are a compile-time construct, and variables hold run-time concepts.
Is there a better or more idiomatic way to do this?
Creating a function or method is always a good solution to avoid repeating code. You can then use this as a guard clause:
fn is_whitespace(c: char) -> bool {
match c {
' ' | '
' | '' | '
' => true,
_ => false,
}
}
fn main() {
let ch = ' ';
match ch {
x if is_whitespace(x) => println!("whitespace"),
_ => println!("token"),
}
}
I'd also strongly recommend using an existing parser, of which there are a multitude, but everyone wants their Rust "hello world" to be parsing, for whatever reason.
A parsing library I use allows writing code akin to this, where whitespace
is a function that knows how to parse the valid types of 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 */);
Each of the things on the right-hand side are still individual functions that know how to parse something specific.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…