雑多なブログ

音楽や語学、プログラム関連の話題について書いています

rust: Option型

Rust には値が存在しない可能性がある場合に使用する、Option 型が用意されている。 Option型は、値が存在する場合と、空の場合がある時に値を操作するのに便利。

Option型の定義は次の通り。

enum Option<T> {
    None,
    Some(T)
}

使用例

let values = vec!["hoge", "fuga", "moge", "gegege"];

println!("{:?}", values.get(0));
println!("{:?}", values.get(2));
println!("{:?}", values.get(100));

出力は次の通り。

Some("hoge")
Some("moge")
None

1〜2回目は配列内のインデックスにアクセスしているため、 結果は Some("hoge")Some("moge") となっている。 100番目の要素を取得しようとすると、パニックにならず None が返された。

パターンマッチ

Some() の中身にアクセスするには、パターンマッチングが利用できる。

let values = vec!["hoge", "fuga", "moge", "gegege"];

for &idx in [0, 1, 3, 5, 100].iter() {
    match values.get(idx) {
        Some(text) => println!("{}", text),
        None => println!("値はありません"),
    }
}

この例を実行すると、出力は次のようになる。

hoge
fuga
gegege
値はありません
値はありません

if let式

if let式を使って、こういった書き方もできる。

let values = vec!["hoge", "fuga", "moge", "gegege"];
if let Some(value) = values.get(100) {
    println!("{}", value);
} else {
    println!("値はありません:");
}   

if let Some(value) = values.get(1) {
    println!("{}", value);
}