有什么用例可以迭代Option
?
简而言之,我最喜欢的原因是flatten https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.flatten:
fn main() {
let results = [Some(1), None, Some(3), None];
let sum: i32 = results.into_iter().flatten().sum();
println!("{}", sum)
}
Rust 1.29之前,你可以使用flat_map https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.flat_map:
fn main() {
let results = vec![Some(1), None, Some(3), None];
let sum: i32 = results.into_iter().flat_map(|x| x).sum();
println!("{}", sum)
}
Option
可以被认为是一个可以容纳零个或一个元素的容器。将其与Vec
,它可以容纳零个或多个元素。在很多方面,Option
is一个容器就像一个Vec
!
实施IntoIterator
allows Option
参与更大份额的 API。
注意IntoIterator
is also实施用于Result
,出于类似的原因。
这非常令人困惑
是的,确实如此,这就是为什么 Clippy有它的绒毛 https://rust-lang.github.io/rust-clippy/master/index.html#for_loops_over_fallibles:
warning: for loop over `str_vec.get(0..3)`, which is an `Option`. This is more readably written as an `if let` statement
--> src/main.rs:10:14
|
10 | for s in str_vec.get(0..3) {
| ^^^^^^^^^^^^^^^^^
|
= note: `#[warn(clippy::for_loops_over_fallibles)]` on by default
= help: consider replacing `for s in str_vec.get(0..3)` with `if let Some(s) = str_vec.get(0..3)`
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#for_loops_over_fallibles
这表明有一些方法可以Option
is not就像程序员的容器一样。