HomePlayground
Intro
RustのOption型の使い方と構文
カニさん
カニさん
September 19, 2022
1
RustのOption型の使い方と構文

Rust の Option 型とは

Rust の Option 型について、Null 参照などの概念も踏まえて解説していきます。

Null 参照

他のプログラミング言語(C/C++、Python、Java、Ruby、Lisp など)を使ったことがある人は、nullnilに出会ったことがあるのではないでしょうか?nullnilの使用は、これらの言語が特定の変数に値がないことを示す方法です。

しかし、このため誤ってnullを指す変数を使用してしまうと、簡単に(そして頻繁に)ミスを犯してしまいます。

ご想像のとおり、存在しない関数を呼び出したり、存在しない値にアクセスしようとすると、あらゆる種類のバグやクラッシュを引き起こす可能性があります。nullの生みの親は、これを「10 億ドルの間違い」とまで言っています。

Option 型

このような問題を避けるため、Rust ではnull参照を使用しません。しかし、特定の変数に値がないことを示す安全な方法がまだ必要です。そこで登場したのがOption型です。Rust の変数には、値を持たない変数の代わりにOption列挙型を使用することができます。

この列挙型には 2 つのバリエーションがあります。None は Rust の null に相当し、 Some(T) は T が任意の型の値であることを示しています。

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

Option 型の使い方

変数に None を設定するのだけです。

let nothing: Option<u32> = None;  // 変数nothingにNoneを代入

しかし、Option型に値を持たせたい場合、その値を直接代入することはできません。Option型の変数と i32型の変数とは等価ではありません。下記のようにSomeを使う必要があります。

let wrong_way: Option<i32> = -4; // エラー

let right_way: Option<i32> = Some(-4); // 代入可
let another_right_way = Some(-4); // コンパイラがOption<i32>と推論する

よくあるエラーの例としてこちらも見てみましょう。

let number = 47;
let option_number = Some(15);

// i32型にOption<i32>型を足そうとしている(エラー)
let compile_error = number + option_number;

Some に含まれる値を取得したい場合、まず、その値が存在するかどうかを確認する必要があります。

let mut some_words = Some("🦀");

match some_words {
    Some(str) => println!("カニさん{}", str),
    None => println!("何もありません。"),
} // "カニさん🦀"と出力される。

some_words = None; // Noneを代入

// 上のmatch構文と全く同じ内容
match some_words {
    Some(str) => println!("カニさん{}", str),
    None => println!("何もありません。"),
} // "何もありません。"と出力される。

さらに、Rust が null参照の代わりにOption型を使用する理由を説明します。ポイントは、Option 変数がSomeか、Noneかをチェックしなければならないということです。

それ以外の場合、プログラムはコンパイルできません。コンパイラはあなたをnullから守っているのです。


タグ

nullNonematch

関連記事

Rustにおけるタプルの使い方とタプル構造体、パターン記法の解説
September 08, 2022
1
© 2023, All Rights Reserved.

初心者向け

RustCoder(推奨)Rust入門(速習)コミュニティ

SNS