はじめに
この実験では、Option が Result と相互作用する場合、または Result<T, Error1> が Result<T, Error2> と相互作用する場合の例を見ます。
注: 実験でファイル名が指定されていない場合は、好きなファイル名を使用できます。たとえば、
main.rsを使用して、rustc main.rs &&./mainでコンパイルして実行できます。
複数のエラー型
以前の例は常に非常に便利でした。Result は他の Result と相互作用し、Option は他の Option と相互作用します。
時には、Option が Result と相互作用する必要があり、または Result<T, Error1> が Result<T, Error2> と相互作用する必要があります。そのような場合、私たちは異なるエラー型を、それらが組み合わせやすく相互作用しやすいように管理したいと考えます。
次のコードでは、unwrap の 2 つのインスタンスが異なるエラー型を生成します。Vec::first は Option を返し、parse::<i32> は Result<i32, ParseIntError> を返します。
fn double_first(vec: Vec<&str>) -> i32 {
let first = vec.first().unwrap(); // エラー1 を生成
2 * first.parse::<i32>().unwrap() // エラー2 を生成
}
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: 要素が数値にパースできません
}
次のセクションでは、この種の問題を処理するためのいくつかの戦略を見ていきます。
まとめ
おめでとうございます!あなたは複数のエラー型の実験を完了しました。あなたの技術を向上させるために、LabEx でさらに多くの実験を行って練習してください。