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);

// 以下と等しい
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(...) とマッチさせるのと同じです。ほとんどの場合、後者の方がよいでしょう。

See also

  • [std::iter::once](https://doc.rust-lang.org/std/iter/fn.once.html)は、厳密に1つの要素を返すイテレータです。Some(foo).into_iter()に代わる、よりわかりやすいイテレータです。

  • Iterator::filter_mapIterator::mapのバージョンで、Optionを返すマッピング関数に特化したものです。

  • ref_sliceOption を 0 要素または 1 要素のスライスに変換する関数を提供します。

  • Option<T> に関する文書

Last change: 2024-07-09, commit: 317c88e