如何保证多个语句全部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!(),
};
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!(),
};