Rust で実装していると、Option 型と Result 型をどう扱うかが重要になってきます。
目次
Option 型と Result 型の使い方
Option<T> 型
Option<T>
型は 値を存在しないかもしれない値 を表現する列挙型です。
- None:実行の失敗や値の欠如を示す
- Some(value):型
T
のvalue
をラップするタプル
match を使った値の確認と取得
Option は値か存在するのか不明な状態なので、match
を使って取り出す必要があります。
fn get_option_value(is_ok: bool) -> Option<usize> {
if is_ok {
Some(100)
} else {
None
}
}
fn main() {
// true: 100が出力される
// false: Noneが出力される
match get_option_value(true) {
None => println!("None"),
Some(v) => println!("{}", v),
}
}
if let でSome(value)の値を取得する
Some の場合だけ処理したいなら、if let
を使うとスッキリ書くことができます。
fn main() {
let value: Option<usize> = None;
// Some(value)ではないため、何も出力されない
if let Some(v) = value {
println!("{}", v);
}
}
fn main() {
let value: Option<usize> = Some(1000);
// 1000が出力される
if let Some(v) = value {
println!("{}", v);
}
}
Option 関連のメソッド
Optionには、他にも便利なメソッドがたくさんあります。
Result<T,E> 型
Result<T,E>
型は エラーが発生するかもしれない値 を表現する列挙型です。
Result は、他言語でいう例外処理を実装する場所で利用します。
- Ok<T>:要素
T
が見つかった場合 - Err<E>:要素
E
とともにエラーが見つかった場合
match で結果を取り出す
use std::num::ParseIntError;
fn get_result(chk_number: &str) -> Result<i32, ParseIntError> {
return match chk_number.parse::<i32>() {
Ok(n) => return Ok(n),
Err(e) => Err(e),
};
}
fn main() {
// "100": 100が出力される
// "error": invalid digit found in string が出力される
match get_result("error") {
Ok(r) => println!("{}", r),
Err(e) => println!("{}", e),
}
}
if let で Ok また Err の結果を取り出す
エラー処理を必要としない場面では、if let
が便利です。
use std::num::ParseIntError;
fn get_result(chk_number: &str) -> Result<i32, ParseIntError> {
return match chk_number.parse::<i32>() {
Ok(n) => return Ok(n),
Err(e) => Err(e),
};
}
fn main() {
if let Ok(r) = get_result("10") {
println!("{}", r);
}
}
また、ガード節を設ける場面では Err のみを取り出すとスッキリ実装できます。
use std::num::ParseIntError;
fn get_result(chk_number: &str) -> Result<i32, ParseIntError> {
return match chk_number.parse::<i32>() {
Ok(n) => return Ok(n),
Err(e) => Err(e),
};
}
fn main() {
if let Err(e) = get_result("error") {
println!("{}", e);
}
}
Result 関連のメソッド
Result にも便利なメソッドがたくさん用意されています。
専用メソッドを使ったエラーハンドリング
Result と Option のエラーハンドリングについて、別の記事でまとめました!
かなりのボリュームになってます。
Rust | エラーハンドリング – Result と Option を上手に扱いたい
Rustのエラーハンドリングについてまとめました!match文やif let構文、expectやunwrapなどの専用メソッドのサンプルコードを書きました。
まとめ
Rust を学んでいて、取り扱いに困った Option 型と Result 型の使い方を簡単にまとめてみました。
著:初田直也, 著:山口聖弘, 著:吉川哲史, 著:豊田優貴, 著:松本健太郎, 著:原将己, 著:中村謙弘, 著:フォルシア株式会社
¥3,208 (2024/11/30 11:10時点 | Amazon調べ)
ポチップ
コメント