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); // 以下と等しい 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(...)
とマッチさせるのと同じです。ほとんどの場合、後者の方がよいでしょう。
See also
-
[std::iter::once
](https://doc.rust-lang.org/std/iter/fn.once.html)は、厳密に1つの要素を返すイテレータです。Some(foo).into_iter()
に代わる、よりわかりやすいイテレータです。 -
Iterator::filter_map
はIterator::map
のバージョンで、Option
を返すマッピング関数に特化したものです。 -
ref_slice
はOption
を 0 要素または 1 要素のスライスに変換する関数を提供します。