有没有办法在匹配中使用自定义模式(如正则表达式或函数)?

时间:2017-04-04 15:14:00

标签: rust pattern-matching

我正在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更具惯用性的模式?我希望将来有更多分支的逻辑,我希望它保持整洁。

1 个答案:

答案 0 :(得分:12)

没有。 match模式必须由可由编译器静态验证的事物组成。

但是,您可以使用比赛后卫

fn rd_tree(chars: std::str::Chars) {
    while let Some(c) = chars.next() {
        match c {
            c if c.is_whitespace() => {}
            '(' => {}
            ')' => {}
            _ => {}
        }
    }
}

匹配防护允许您针对匹配的模式运行函数。