Optionに対する反復処理

説明

Optionは、0個または1個の要素を含むコンテナとして見ることができます。 特に、IntoIteratorトレイトを実装しているため、そのような型を必要とする ジェネリックなコードで使用できます。

OptionIntoIteratorを実装しているため、 .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を使用する方が より慣用的であることに注意してください。

また、OptionIntoIteratorを実装しているため、forループを使用して 反復処理することが可能です。これはif let Some(..)でマッチングするのと同等ですが、 ほとんどの場合、後者の方が望ましいでしょう。

参考

  • std::iter::onceは、 正確に1つの要素を生成するイテレータです。Some(foo).into_iter()よりも 読みやすい代替手段です。

  • Iterator::filter_mapは、 Iterator::mapの バージョンで、Optionを返すマッピング関数に特化しています。

  • ref_sliceクレートは、 Optionを0個または1個の要素を持つスライスに変換する関数を提供します。

  • Documentation for Option<T>