他言語でいうNULLを使いたいときはこれ。
成果物
コード
fn main() { let some1 = Some(5); let some2 = Some("hello"); let opt: Option<i32> = None; println!("{:?}", some1); println!("{:?}", some2); println!("{:?}", opt); let x: Option<i8> = Some(5); println!("{:?}", x); // println!("{:?}", 3+x); // error[E0277]: cannot add `std::option::Option<i8>` to `{integer}` }
Enum std::option::Option
enum Option<T> { Some(T), None, }
Rustは基本NULLになりえない。もしNULLを使いたいなら明示する必要がある。それが上記のenum型Option
である。
Optionは標準ライブラリに定義されている。さらに初期化処理にもあるため、use
などせずとも使える。列挙子までそうであるため、接頭辞Option::
なしでSome
, None
が使える。
ジェネリック型引数。enum Option<T>
は、何かしらの引数を1つだけ持つという意味。
Some(T)
Some(T)
は何かしらの型を1つ持った、匿名タプル構造体型である。
let some1 = Some(5); let some2 = Some("hello");
Some
の引数はi32型, &str型など、何でもいい。
None
Noneは他言語でいうところのNULL相当。enum型Option<T>
の値のひとつであり、引数に構造体をとらない。
let nullable_int: Option<i32> = None; nullable_int = Some(100);
変数nullable_int
はi32型だが、NULLも許容したい。そんなときにOption<i32>
型を使う。
以下はエラーになる。
nullable_int = 100; // error nullable_int = Some("hello"); // error let sum = Some(5) + 1; // error
Some(T)におけるTの値を取得する
fn main() { let five = Some(5); let six = plus_one(five); let none = plus_one(None); } fn plus_one(x: Option<i32>) -> Option<i32> { match x { None => None, Some(i) => Some(i + 1), } }
ポイントはmatch x { Some(i) => ... }
のSome(i)
にあるi
。値がなんであれマッチするし、その値を変数i
として取り出せる。
参考
- https://doc.rust-jp.rs/book/second-edition/ch06-01-defining-an-enum.html#option-enum%E3%81%A8null%E5%80%A4%E3%81%AB%E5%8B%9D%E3%82%8B%E5%88%A9%E7%82%B9
- https://doc.rust-lang.org/stable/std/option/enum.Option.html
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
$ uname -a Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
前回まで
- Rustを学んでみたい(プログラミング言語)
- Rustの環境構築
- RustでHelloWorld
- Rustの和訳ドキュメント
- Cargoでプロジェクト作成・ビルド・実行
- クレートとは?
- Rustで関数を使ってみる
- Rustでモジュールを使ってみる
- Rustで乱数を生成する(rand)
- Rustで標準入力する(std::io::stdin().read_line())
- RustでMatch判定する(match)
- Rustでprintとread_lineを1行にする方法
- Rustで数当てゲーム
- クレート名にドット.が使えない
- Rustの変数と可変性(let, mut) error[E0384]: cannot assign twice to immutable variable
x
- Rustのimmutable束縛とconst定数の違い
- RustのREPL、evcxrのインストールに失敗した
- Rustでコンパイルするときの変数未使用warningを消す
- Rustの変数(再代入、再宣言(シャドーイング))
- Rustのシャドーイングについて
- イミュータブルについて(副作用)
- Rustの定数(const)
- Rustのデータ型(数値)
- Rustのデータ型(論理)
- Rustのデータ型(文字)
- Rustのデータ型(タプル)
- Rustのデータ型(配列)
- Rustの関数
- Rustのif式
- Rustのくりかえし文(loop)
- Rustのくりかえし文(while)
- Rustのくりかえし文(for)
- Rustの所有権(ムーブ)
- Rustの所有権(関数)
- Rustの所有権(スライス)
- Rustの構造体(定義とインスタンス化)
- Rustの構造体(プログラム例)
- Rustの構造体(メソッド)
- Rustの列挙型(enum)
- Rustのmatch(制御フロー演算子)