MyUtils

View on GitHub

Grammar and basic usage of Rust

Result,Optionの使い方

以降の章でエラーハンドリングについてまとめるが、

match式if letを使用して、ResultOptionの値を処理することが多い。 また、exceptunwrapを使用することで、エラー処理を行う。


println!("Result and Option------------------------");
println!("Result-----------------------------------");
let result: Result<i32, String> ;//= Ok(40);
result = Err("Error occurred".to_string());
match result {
    Ok(num) => println!("Parsed number: {}", num),
    Err(ref e) => println!("Failed to parse: {}", e),
}
println!("Option-----------------------------------");
let option: Option<i32>;
option = Some(10);
match option {
Some(num) => println!("Parsed number: {}", num),
None => println!("Failed to parse"),
}

sample ソース

エラーハンドリング

Rustのエラーハンドリングは、Result型で行われる。 Result型は、成功した場合はOk(T)、失敗した場合はErr(E)を返す列挙型である。 このため、エラー処理は、match式やunwrapメソッドなどを使用して行われる。 また、?演算子を使用することで、エラーを簡単に伝播させることもできる。

unwarpは、失敗したことで以後の処理ができない場合に使用することが多い。 例えば、設定ファイルが読み込めなかった場合などは、unwarp,exceptを使用してエラーを処理することが多い。

sample ソース

fn error_example() {
    // OKとなるパターン
    let num_str = "10";
    //let num_str = "10fa";
    let result: Result<i32, std::num::ParseIntError> = num_str.parse();


    // match式を使用してエラー処理
    // Ok,Err両方のパターンを記述すること
    match result {
        Ok(num) => println!("Parsed number: {}", num),
        Err(ref e) => println!("Failed to parse: {}", e),
    }

    // Ok or Errorの場合のみ処理を分岐する場合
    if let Ok(num) = result {
        println!("Parsed number: {}", num);
    } else  if let Err(ref e) = result {
        println!("Failed to parse: {}", e);
    }    

    // 直接値を取り出す場合
    let result = num_str.parse()?;
    println!("Parsed number: {}", result);

}
fn error_example() {
    let num_str = "10";
    //let num_str = "10fa";
    let result: Result<i32, std::num::ParseIntError> = num_str.parse();

    // unwrapを使用してエラー処理
    // 成功した場合は値を返し、失敗した場合はパニックする
    //let num = result.unwrap();
    
    // expectを使用してエラー処理
    // 成功した場合は値を返し、
    // 失敗した場合は"指定したメッセージ"でパニックする
    let num = result.expect("Failed to parse number");
    println!("Parsed number: {}", num);
}

fn error_example2() {
    let opt: Option<i32> = None

    // unwrapを使用してエラー処理
    // Noneでない場合には値を返し、失敗した場合はパニックする
    //let num = opt.unwrap();
    
    // expectを使用してエラー処理
    // Noneでない場合には値を返し、
    // 失敗した場合は"指定したメッセージ"でパニックする
    let num = opt.expect("Failed to parse number");
    println!("Parsed number: {}", num);
}

File Reading and Writing

例えば、std::fs::read_to_stringを使用して、ファイルの内容を文字列として読み込むことができる。

sample ソース