🦀
The Rust Programing Language 7日目
前回のあらすじ
ベクタや文字列、HashMapなどについて学ぶ
ベクタ、リストよりかっこいいね
本日は9章 エラー処理
ここに来て1日開いてしまったが、別に毎日やるなんて言ってないのでOK
なるべく毎日やりたいが、志は低くする方が折れて辞めにくいというのは歴史が証明している
本日の学び
Rustのエラー
- Rustには例外が無い
- 回復可能なエラーには
Result<T, E>値がある - 回復不能なエラーに到達した際には実行を中止する
panic!マクロがある
- 回復可能なエラーには
- パニックが起きた際、通常プログラムは巻き戻しを行う
- 関数を片付けるなどやることは多い
-
Cargo.tomlの[profile]欄にpanic = 'abort'を指定することで、即座に終了させることができる- 実行可能ファイルが小さくなる
-
RUST_BACKTRACE環境変数を0以外の値にすることでトレースを出力できる
Result
- 処理を以上終了させるほどではないエラーは回復可能なエラー
- 関数の戻り値では無さそうな型注釈を書くことで、実際の戻り値の型を知るTips
-
let f: u32 = File::open("hello.txt");-
File::openはResult<std::fs::File, std::io::Error>を返すことがわかる
-
-
-
Resultを受け取り、matchで結果に応じた処理を行う-
Resultは初期化処理でインポートされている
-
- エラーの種類によって動作を変更する
use std::fs::File; use std::io::ErrorKind; fn main() { let f = File::open("hello.txt"); let f = match f { Ok(file) => file, Err(ref error) if error.kind() == ErrorKind::NotFound => { match File::create("hello.txt") { Ok(fc) => fc, Err(e) => { panic!( //ファイルを作成しようとしましたが、問題がありました "Tried to create file but there was a problem: {:?}", e ) }, } }, Err(error) => { panic!( "There was a problem opening the file: {:?}", error ) }, }; }-
io::ErrorKindと言うenumが標準ライブラリで提供されている-
kindメソッドで取得できる
-
- matchアームに条件式を追加することで、
trueの時のみ実行される
-
-
unwrapメソッドで、OkならOkの中身を返し、Errならpanic!を呼んでくれるlet f = File::open("hello.txt").unwrap();-
expectはエラーメッセージも指定できるlet f = File::open("hello.txt").expect("Failed to open hello.txt");
-
Resultを返して、エラーを委譲する- つまり
throwするみたいなことね -
?演算子で、Errの時そのErrを自動的にリターンしてくれるf.read_to_string(&mut s)?;- なんか最後に?ついてるコード見たことある気がする、これか〜
- 連結もできるぞ!
File::open("hello.txt")?.read_to_string(&mut s)?;
-
Resultを返す関数の中でしか使えないので注意
- つまり
本日のまとめ
Rustにおけるエラー処理の片鱗を味わった
ちょっとこれ毎回書くのめんどくさそうだな〜という部分には省略できる記法が存在していて、痒いところに手が届くという感じ
panicするのかResultするのかという部分については従来の開発と考えとして変わらなそうだと思ったので省略
明日はとうとう10章
来たな、ライフタイム・・・!
Discussion