我正在Rust写一个玩具编程语言。我用Ruby编写了解析器逻辑原型:
def rd_tree(chars)
loop do
case c = chars.next
when /\s/
# whitespace stuff
when "("
# open paren stuff
when ")"
# close paren stuff
else
# default stuff
end
end
end
现在我将它转换为Rust:
fn rd_tree(chars: std::str::Chars) {
while let Some(c) = chars.next() {
if c.is_whitespace() {
// whitespace stuff
} else if c == '(' {
// open paren stuff
} else if c == ')' {
// close paren stuff
} else {
// default stuff
}
}
}
我使用了if,else-if链,因为据我所知,Rust的匹配功能仅限于解构,枚举和类型模式。有没有办法匹配正则表达式或布尔函数?如果没有,这里是否存在比if,else-if更具惯用性的模式?我希望将来有更多分支的逻辑,我希望它保持整洁。
答案 0 :(得分:12)
没有。 match
模式必须由可由编译器静态验证的事物组成。
但是,您可以使用比赛后卫:
fn rd_tree(chars: std::str::Chars) {
while let Some(c) = chars.next() {
match c {
c if c.is_whitespace() => {}
'(' => {}
')' => {}
_ => {}
}
}
}
匹配防护允许您针对匹配的模式运行函数。