Rust 如何仅映射迭代器中的某些()值?
以下两种方法都可以工作(在2次调用中),但它们感觉太冗长了Rust 如何仅映射迭代器中的某些()值?,rust,Rust,以下两种方法都可以工作(在2次调用中),但它们感觉太冗长了 fn main(){ 设v=vec![Some(0),Some(1),None,Some(2)]; 断言( 向量![0,2,4], v、 iter() .filter(|x | x.is_some()) .map(| x | x.unwrap()*2) 收集::()); 断言( 向量![0,2,4], v、 iter() .filter|u映射(|x |*x) .map(|x | x*2) 收集::()); } 过滤器映射接近我想要
fn main(){
设v=vec![Some(0),Some(1),None,Some(2)];
断言(
向量![0,2,4],
v、 iter()
.filter(|x | x.is_some())
.map(| x | x.unwrap()*2)
收集::());
断言(
向量![0,2,4],
v、 iter()
.filter|u映射(|x |*x)
.map(|x | x*2)
收集::());
}
过滤器映射接近我想要的:
[filter_map]自动删除选项层。如果你的
映射已返回一个选项,您想跳过它
如果没有,那么过滤器映射使用起来会非常非常好
但它不会打开闭包中的值,因为它希望返回一个选项
是否有一种方法既可以只过滤某些值,又可以通过一次调用映射这些值?
例如:
//假,不起作用
fn main(){
设v=vec![Some(0),Some(1),None,Some(2)];
断言(
向量![0,2,4],
v、 iter()
.map_only_some(|x | x*2)
收集::());
}
我算出了,迭代器的next总是返回一个选项,所以您只需将其展平:
//因为v.iter().next()是Some(Some(0)),所以下面的代码可以工作
断言!(
向量![0,2,4],
v、 iter()
.flatte()
.map(|x | x*2)
收集::());
它不在一次调用中,但它更干净,而且我认为是惯用的
是否有一种方法既可以只过滤某些值,又可以通过一次调用映射这些值
您已经在使用它了filter\u map()
:
fn main(){
设v=vec![Some(0),Some(1),None,Some(2)];
断言(
向量![0,2,4],
v、 iter()
.filter|map(|x | x.map(|x | x*2))
收集::()
);
}
请注意,这相当于。filter_map(|x |*x)
只是更短而已