Option

すでに Option<T> の使用例をいくつか見てきました。これは、型 T の値、または何もない状態のいずれかを保持します。たとえば、 String::findOption<usize> を返します。

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let name = "Löwe 老虎 Léopard Gepardi";
    let mut position: Option<usize> = name.find('é');
    dbg!(position);
    assert_eq!(position.unwrap(), 14);
    position = name.find('Z');
    dbg!(position);
    assert_eq!(position.expect("Character not found"), 0);
}
  • Option は標準ライブラリだけでなく、広く使われています。

  • unwrapOption 内の値を返し、値がなければ panic します。expect も同様 ですが、エラーメッセージを受け取ります。

    • None のときに panic することはできますが、None のチェックを 「うっかり」忘れることはありません。
    • 何かを手早く組み立てているときには、あちこちで unwrap/expect を使う ことがよくありますが、本番コードでは通常、None をもっと適切に扱います。
  • 「niche optimization」とは、Option<T> は、T として有効でない表現が 何か 1 つでもある場合、通常メモリ上で T と同じサイズになる、ということです。 たとえば、参照は NULL にはなれないので、Option<&T> は自動的に NULL を None バリアントの表現として使い、その結果 &T と同じ メモリに格納できます。