从 Option 中提取 Result
处理混合错误类型最基本的方法是将它们相互嵌套。
use std::num::ParseIntError;
fn double_first(vec: Vec<&str>) -> Option<Result<i32, ParseIntError>> {
vec.first().map(|first| {
first.parse::<i32>().map(|n| 2 * n)
})
}
fn main() {
let numbers = vec!["42", "93", "18"];
let empty = vec![];
let strings = vec!["tofu", "93", "18"];
println!("第一个数的两倍是 {:?}", double_first(numbers));
println!("第一个数的两倍是 {:?}", double_first(empty));
// 错误 1:输入向量为空
println!("第一个数的两倍是 {:?}", double_first(strings));
// 错误 2:元素无法解析为数字
}
有时我们希望在遇到错误时停止处理(例如使用 ?),但在 Option 为 None 时继续执行。这时 transpose 函数就派上用场了,它可以方便地交换 Result 和 Option。
use std::num::ParseIntError;
fn double_first(vec: Vec<&str>) -> Result<Option<i32>, ParseIntError> {
let opt = vec.first().map(|first| {
first.parse::<i32>().map(|n| 2 * n)
});
opt.transpose()
}
fn main() {
let numbers = vec!["42", "93", "18"];
let empty = vec![];
let strings = vec!["tofu", "93", "18"];
println!("第一个数的两倍是 {:?}", double_first(numbers));
println!("第一个数的两倍是 {:?}", double_first(empty));
println!("第一个数的两倍是 {:?}", double_first(strings));
}