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();
}