关于 Option
的迭代器
说明
Option
可以被视为一个包含一个0个或者1个元素的容器。特别是它实现了IntoIterator
特性,这样我们就可以用来写泛型代码。
示例
因为Option
实现了IntoIterator
特性,它就可以用来当.extend()
的参数:
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()
:
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个元素的切片的函数。