问题描述
我想通过一次检查来匹配元组向量及其内容。如果元组内的值等于 some_value
(a usize
),那么我会做一些事情,对于其他所有情况,我会做一些其他事情。
我用基本逻辑处理它:
if myvector.is_empty() {
// do action 1
} else if myvector.last().unwrap().0 == some_value {
// do action 2
} else {
// do action 1
}
这符合我的要求,但我觉得有一种更惯用的方式来做到这一点。
我一直在尝试match
:
match myvector.last() {
Some(t) => match t.0 == some_value {
true => unimplemented!("do action 2"),false => unimplemented!("do action 1"),},None => unimplemented!("do action 1"),}
这也有效,但我正在尝试找出一种更好的语法来仅涵盖一个案例(action1
)。
解决方法
您可以使用slice pattern提取最后一个元素,并直接在模式中解构元组:
fn test_last(v: &[(u32,u32)],testval: u32) -> u32 {
match v {
[..,(val,_)] if *val == testval => {
// action 2
}
_ => {
// action 1
}
}
}
,
我有以下工作:
match myvector.last() {
Some(t) if t.0 == some_value => unimplemented!("do action2"),_ => unimplemented!("do action1"),}
,
我会这样做:
if let Some(_) = my_vector.last().filter(|(n,_)| n == some_value) {
// do action 2
} else {
// do action 1
}