是否可以在同一个匹配臂中组合两种模式,一种带有匹配防护装置?

时间:2017-02-20 22:39:49

标签: rust

我想检查字符串是否包含'$'以及'$'后面是否有内容:

我试过这段代码:

fn test(s: String) {
    match s.find('$') {
        None | (Some(pos) if pos == s.len() - 1) => {
          expr1();
        }
        _ => { expr2(); }
    }
}

但它没有编译:

error: expected one of `)` or `,`, found `if`

是否无法将NoneSome合并到一个匹配臂中?

如果是这样,有没有一种简单的方法可以不复制expr1(),除非将其移动到单独的函数中?

1 个答案:

答案 0 :(得分:7)

不可能让匹配保护(if thingy)仅适用于一种模式替代(由|符号分隔的事物)。每只手臂只有一个防护装置,它适用于该手臂的所有模式。

但是,针对您的具体问题有很多解决方案。例如:

if s.find('$').map(|i| i != s.len() - 1).unwrap_or(false) {
    expr2();
} else {
    expr1();
}