Option
すでに Option<T> の使用例をいくつか見てきました。これは、型 T の値、または何もない状態のいずれかを保持します。たとえば、 String::find は Option<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は標準ライブラリだけでなく、広く使われています。 -
unwrapはOption内の値を返し、値がなければ panic します。expectも同様 ですが、エラーメッセージを受け取ります。- None のときに panic することはできますが、None のチェックを 「うっかり」忘れることはありません。
- 何かを手早く組み立てているときには、あちこちで
unwrap/expectを使う ことがよくありますが、本番コードでは通常、Noneをもっと適切に扱います。
-
「niche optimization」とは、
Option<T>は、Tとして有効でない表現が 何か 1 つでもある場合、通常メモリ上でTと同じサイズになる、ということです。 たとえば、参照は NULL にはなれないので、Option<&T>は自動的に NULL をNoneバリアントの表現として使い、その結果&Tと同じ メモリに格納できます。