关于 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); // equivalent to 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!("{} is a logician", logician); } }
注意如果这个Option总是非空的,那么用std::iter::once更加合适。
此外,因为Option实现了IntoIterator特性,它就可以用for循环来迭代。这等价于用if let Some(..),大多数情况下倾向于用后者。
参阅
-
std::iter::once是一个只产生一个元素的迭代器。这有一个更具可读性的替代品Some(foo).into_iter()。 -
Iterator::filter_map是Iterator::flat_map专注于处理返回值是Option的map函数版本。 -
ref_slice包提供将Option转换为0个或1个元素的切片的函数。