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(..) でマッチさせるのと同等であり、ほとんどの場合は後者を優先すべきです。
関連項目
-
std::iter::onceは、ちょうど 1 つの要素を生成する イテレーターです。これはSome(foo).into_iter()よりも読みやすい代替手段です。 -
Iterator::filter_mapは、Iterator::mapの一種であり、Optionを返すマッピング関数に特化したものです。 -
ref_sliceクレートは、Optionを 0 個または 1 個の要素を持つスライスに変換する関数を提供します。