如何使用单个检查匹配元组向量及其内容?

问题描述

我想通过一次检查来匹配元组向量及其内容。如果元组内的值等于 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
        }
    }
}

Playground

,

我有以下工作:

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
}