简介
在本实验中,我们将学习如何通过在 Rust 中使用 Option 和 Result 类型将混合错误类型相互嵌套来处理它们。
注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用
main.rs,并通过rustc main.rs &&./main进行编译和运行。
在本实验中,我们将学习如何通过在 Rust 中使用 Option 和 Result 类型将混合错误类型相互嵌套来处理它们。
注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用
main.rs,并通过rustc main.rs &&./main进行编译和运行。
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!("The first doubled is {:?}", double_first(numbers));
println!("The first doubled is {:?}", double_first(empty));
// 错误 1:输入向量为空
println!("The first doubled is {:?}", double_first(strings));
// 错误 2:元素无法解析为数字
}
有时我们希望在遇到错误时(比如使用 ? 时)停止处理,但当 Option 为 None 时继续处理。有几个组合子在交换 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.map_or(Ok(None), |r| r.map(Some))
}
fn main() {
let numbers = vec!["42", "93", "18"];
let empty = vec![];
let strings = vec!["tofu", "93", "18"];
println!("The first doubled is {:?}", double_first(numbers));
println!("The first doubled is {:?}", double_first(empty));
println!("The first doubled is {:?}", double_first(strings));
}
恭喜你!你已经完成了从 Option 中提取 Result 的实验。你可以在 LabEx 中练习更多实验来提升你的技能。