关于 Option的迭代器
说明
Option可以被视为一个包含一个0个或者1个元素的容器。特别是它实现了IntoIterator特性,这样我们就可以用来写泛型代码。
示例
因为Option实现了IntoIterator特性,它就可以用来当.extend()的参数:
let turing = Some("Turing");let mut logicians = vec!["Curry", "Kleene", "Markov"];logicians.extend(turing);// equivalent toif 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个元素的切片的函数。
