Използване на 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