Optionに対する反復処理
説明
Optionは、0個または1個の要素を含むコンテナとして見ることができます。
特に、IntoIteratorトレイトを実装しているため、そのような型を必要とする
ジェネリックなコードで使用できます。
例
OptionはIntoIteratorを実装しているため、
.extend()の引数として使用できます:
#![allow(unused)] fn main() { let turing = Some("Turing"); let mut logicians = vec!["Curry", "Kleene", "Markov"]; logicians.extend(turing); // equivalent to if let Some(turing_inner) = turing { logicians.push(turing_inner); } }
既存のイテレータの末尾にOptionを追加する必要がある場合は、
.chain()に渡すことができます:
#![allow(unused)] fn main() { let turing = Some("Turing"); let logicians = vec!["Curry", "Kleene", "Markov"]; for logician in logicians.iter().chain(turing.iter()) { println!("{logician} is a logician"); } }
Optionが常にSomeである場合は、要素に対して
std::iter::onceを使用する方が
より慣用的であることに注意してください。
また、OptionはIntoIteratorを実装しているため、forループを使用して
反復処理することが可能です。これはif let Some(..)でマッチングするのと同等ですが、
ほとんどの場合、後者の方が望ましいでしょう。
参考
-
std::iter::onceは、 正確に1つの要素を生成するイテレータです。Some(foo).into_iter()よりも 読みやすい代替手段です。 -
Iterator::filter_mapは、Iterator::mapの バージョンで、Optionを返すマッピング関数に特化しています。 -
ref_sliceクレートは、Optionを0個または1個の要素を持つスライスに変換する関数を提供します。