Използване на Option като итератор

Типа Option може да се разглежда като колекция с 0 или 1 елемента. Наистина, Option имплементира IntoIterator:

for n in Some(4) {
    println!("{}", n);
}

Това не изглежда твърде полезно. Все пак, можем да направим същото с if let Some(n) = ..., и то по-четимо. Конвертирането до итератор става доста по-интересно, когато искаме, да речем, да добавим елемент към края на вектор, стига да има такъв:

let turing = Some("Turing");
let mut logicians = vec!["Curry", "Kleene", "Markov"];

logicians.extend(turing);

Метода extend приема нещо, което може да се конвертира до итератор, и добавя елементите към края на вектора. Няма нужда първо да pattern-match-ваме Option-а -- правим го с едно извикване на метод.

Метода chain на итератор също позволява удобно добавяне на елемент накрая на някаква итерация:

let turing = Some("Turing");
let logicians = vec!["Curry", "Kleene", "Markov"];

for logician in logicians.iter().chain(turing.iter()) {
    println!("{} is a logician", logician);
}

Тесен use-case е, вярно е. Но да имате интуицията, че можете да третирате Option като контейнер, е полезно -- може да измислите удобен начин да съкратите някакво количество код в някои ситуации.

Източник: Rust Design Patterns