おしながき
- 自己紹介
- 概要
- Result
- Option
自己紹介
どうも、***†限界開発鯖†***に住んでいる高専生、いっそうです。
最近は課題を放り投げてコーディングしています。
twitterにも住んでます。
概要
最近Rustの勉強をこのリポジトリでの開発を通して始めました。
その中でRustで結構躓いてた(躓いている)点について自分なりの認識をまとめていきたいと思います。
Result
定義
関数の返り値として返して、成功、失敗を表す型。
定義としては
pub enum Result<T, E> {
Ok(T),
Err(E),
}
となっており、Tが成功したときに返す型、Eが失敗したときに返す型となっています。
特徴としては、エラー処理をしないと値が取り出せないということが挙げられます。
実際の使い方
多分あれこれ言っててもわからんと思うので実際のコードから見ていきましょう。
fn calc(a: i32, b: i32, c: &str) -> Result<i32, String> {
if c == "fail" {
return Err(c.to_string());
}
Ok(a + b)
}
fn main() {
let result = match calc(3, 2 "fail") {
Ok(number) => number,
Err(_) => 0
};
}
今回の場合はcalcはa,b,cの3つの変数を受取り、cがfailである場合である時にErr("fail")を返します。
そして、cがfail以外である場合はaとbを足し合わせた結果をOk(result)という形で返します。
今回は、Ok、Errの2種類のどちらかが返ってくるので、matchでそれぞれについて処理を行います。
この場合だとErrが返ってくるとresultは0になります。
便利な書き方
正直上の書き方を何回もやるのは面倒です。
matchなんてなんどもなんども書きたくありません
というわけで?の出番です。
?
これは別に伏せ字にしてるわけではありません。
?はもし、Err()が返ってきた場合にErr(帰ってきたErrの中身)としてErrを返すものです。
訳わかりませんね。
でも使ってると便利さがわかってきます。
というか先駆者様の記事に書いてあるのでそっち読んだほうが早いです。
危険な方法としてはunwrapがあります。
これはResultにErrが入っていたら即パニックになりますが、Ok(value)のvalueを取り出せます。
Option
えっOptionalじゃないの?って思ったかも知れません。
はい、Optionです。
基本の考え方はOptionalと同じです。
定義
とりあえず定義を見てみましょう。
enum Option<T> {
None,
Some(T)
}
まあよくあるOptionalですね。
値がある場合はSome(T)が入ります。
値の取り出し方
値の取り出しにはmatchが使えます。
let hoge = match somethingOption {
Some(fuga) => fuga,
None => INITIAL_VALUE
};
こんな感じですね。
危険な方法としてはこれまたunwrapがあります。
これはOptionにNoneが入っていたら即パニックになりますが、Some(value)のvalueを取り出せます。
まとめ
- 関数でエラーが発生するときは
Result<T, E>を返す- エラーの処理は呼び出し元で
?やmatchで行う
- エラーの処理は呼び出し元で
- 関数で値が返ってこない可能性がある場合は
Option<T>を返す- エラーの処理は呼び出し元で
matchで行う
- エラーの処理は呼び出し元で
面倒になったらunwrap