今日の内容
- Option
はじめに
前回はジェネリクスについて学びました。
今日は Option について学びます。
Optionとは
Option<T>
は、値が「存在する」か「存在しない」かを表現するRustの列挙型(enum)
です。値が存在しない場合はNone
で表します。
これはnullを安全に扱う代替手順として設計されており、Rustでは直接的なnullが存在しないため、Option<T>
を使うことで値の有無を安全に扱えます。
Optionの定義
Option型は次のように定義されています。
標準ライブラリに用意されています。
enum Option<T> {
Some(T), // 値が存在する場合
None, // 値が存在しない場合
}
ジェネリクスが使われています。
Optionを使うシナリオ
-
値が存在するかどうかが分からない場合
- 例:配列の特定のインデックスに値があるか
-
値が無効な場合にNoneを使う
- 例:設定ファイルが見つからない。データベース検索結果が空など
Optionの基本的な使い方
生成
let some_number: Option<i32> = Some(5); // 値が存在
let no_number: Option<i32> = None; // 値が存在しない
Optionの値を扱う(match構文)
Optionを使う際、値を取り出す方法としてmatchが基本です。
fn main() {
let value: Option<i32> = Some(10);
match value {
Some(num) => println!("値が存在します: {}", num),
None => println!("値が存在しません"),
}
}
3.簡略された取り出し(unwrap)
値が必ず存在すると確信している場合は、unwrap
を使います。
let value: Option<i32> = Some(10);
println!("{}", value.unwrap());
unwrap
はNoneの場合にプログラムをクラッシュさせることに注意です。
4.値がない場合のデフォルト値(unwrap_or)
unwrap_orを使えば、値がNoneの場合にデフォルト値を指定できます。
let value: Option<i32> = None;
println!("{}", value.unwrap_or(0));
5.関連メソッド
Optionには多くの便利なメソッドが用意されています。
(1) is_someとis_none
let value: Option<i32> = Some(5);
println!("{}", value.is_some());
println!("{}", value.is_none());
(2) map
値を変換します。
let value: Option<i32> = Some(5);
let doubled = value.map(|x| x * 2);
println!("{:?}", doubled);
(3) and_then
値を使ってさらにOptionを返す処理を行います
let value: Option<i32> = Some(5);
let result = value.and_then(|x| if x > 0 { Some(x*2) } else { None });
println!("{:?}", result);
(4) unwrap_or_else
デフォルト値を計算するクロージャを指定します。
let value: Option<i32> = None;
let result = value.unwrap_or_else(|| 42);
println!("{}", result);
Optionの実践例
- 配列から値を取得
Optionを活用すると、配列やベクタのインデックスを安全に扱えますfn main() { let numbers = vec![10, 20, 30]; if let Some(value) = numbers.get(1) { println!("値が存在します: {}", value); } else { println!("値が存在しません"); } }
- 設定ファイルの読み取り
設定が存在する場合にSome、存在しない場合にNoneを返しますfn get_config(key: &str) -> Option<&str> { if key == "username" { Some("Alice") } else { None } } fn main() { match get_config("username") { Some(value) => println!("設定: {}", value), None => println!("設定値が見つかりません"), } }
おわりに
本日はOptionについて学びました。
次回はResultについて学びます。
ご精読ありがとうございました。