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

How do I match a vector of tuples and its content using a single check?

我想使用单个检查来匹配元组向量及其内容。如果元组中的值等于 some_valueusize),那么我会做一些事情,对于其他情况,我会做一些其他事情。

我按照基本逻辑是这样处理的:

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)。

我使用了以下方法:

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
}

可以使用slice pattern提取最后一个元素,直接在模式中解构元组:

fn test_last(v: &[(u32, u32)], testval: u32) -> u32 {
    match v {
        [.., (val, _)] if *val == testval => {
            // action 2
        }
        _ => {
            // action 1
        }
    }
}

Playground