Rust 在同一个比赛臂中,是否可以组合两种模式,一种是带比赛后卫的模式?

Rust 在同一个比赛臂中,是否可以组合两种模式,一种是带比赛后卫的模式?,rust,Rust,我想检查字符串是否包含“$”,以及“$”后面是否有内容: 我尝试了以下代码: fn test(s: String) { match s.find('$') { None | (Some(pos) if pos == s.len() - 1) => { expr1(); } _ => { expr2(); } } } 但它没有编译: 是否不可能将None和Some组合在一个匹配臂中 如果是这样的话,除

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

我尝试了以下代码:

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

是否不可能将
None
Some
组合在一个匹配臂中


如果是这样的话,除了将其移动到单独的函数中之外,是否有一种简单的方法不复制
expr1()

不可能将匹配保护(如果
If
thingy)仅应用于一种模式选择(由
符号分隔的事物)。每只手臂只有一个比赛后卫,它适用于该手臂的所有模式

但是,对于您的特定问题,有许多解决方案。例如:

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

这是可行的,但取决于
$
是ASCII,因此占用一个字节。更通用的解决方案可能使用:
i!=s、 len()-'c'.len_utf8()
。我想加入代码高尔夫:
s.chars().skip_while(|I | I!='$).skip(1).next().is_some()
比我所做的任何索引计算都清晰得多
if s.find('$').map(|i| i != s.len() - 1).unwrap_or(false) {
    expr2();
} else {
    expr1();
}