如何保证多个语句全部return一些?

How do I ensure multiple statements all return Some?

let message = tokens.pop().expect("rabl_server encountered login error #send_message()");
let target = tokens.pop().expect("rabl_server encountered login error #send_message()");
let sender = tokens.pop().expect("rabl_server encountered login error #send_message()");

目前有这段代码试图从一个向量中提取一些元素(我已经确保有适当数量的元素)并且想知道是否有一些标准方法可以实现与上面的一个,并检查所有操作是否立即返回 Some,而不是本质上将相同的 .expect() 语句写三次?谢谢

您说您已确保向量具有正确数量的元素,我认为这意味着您保证 pop() 全部 return Some(_)。替代方案可以是:

fn main() {
    let mut tokens = vec!["1", "2", "3"];

    let mut i = tokens.drain(..3);
    match (i.next(), i.next(), i.next()) {
        (Some(message), Some(target), Some(sender)) => {
            println!("do something: {} {} {} ", message, target, sender);
        }
        _ => unreachable!(),
    }
}

drain() 如果范围不正确会 panic 所以调用 unreachable 是可以的。

既然你说你不想重复 expect 我也假设你不想只是重复 unwrap()。上面的代码最大限度地减少了重复,同时还传达了只有 Some 将被 returned.

如果您不需要所有权,您可以使用 as_slice() 并使用切片模式匹配:

match tokens.drain(..3).as_slice() {
    [message, target, sender] => {
        println!("do something: {} {} {} ", message, target, sender);
    }
    _ => unreachable!(),
};