gpt4 book ai didi

rust - 如何仅映射迭代器中的Some()值?

转载 作者:行者123 更新时间:2023-12-03 11:35:12 24 4
gpt4 key购买 nike

以下两项工作(两次调用),但是它们太冗长了。


fn main() {
let v = vec![Some(0), Some(1), None, Some(2)];
assert_eq!(
vec![0,2,4],
v.iter()
.filter(|x| x.is_some())
.map(|x| x.unwrap() * 2)
.collect::<Vec<u8>>());
assert_eq!(
vec![0,2,4],
v.iter()
.filter_map(|x| *x)
.map(|x| x*2)
.collect::<Vec<u8>>());
}
filter_map接近我想要的:

[filter_map] removes the Option layer automatically. If yourmapping is already returning an Option and you want to skip overNones, then filter_map is much, much nicer to use.


doc.rust-lang.org
但是它不会解开闭包中的值,因为它期望返回Option。
是否有办法仅对Some值进行过滤,并通过一次调用映射这些值?
如:
// Fake, does not work
fn main() {
let v = vec![Some(0), Some(1), None, Some(2)];
assert_eq!(
vec![0,2,4],
v.iter()
.map_only_some(|x| x * 2)
.collect::<Vec<u8>>());
}

最佳答案

好吧,我弄清楚了,Iterator的next总是返回一个Option,因此您只需将其展平即可:

// Since v.iter().next() is Some(Some(0)), the following works
assert_eq!(
vec![0,2,4],
v.iter()
.flatten()
.map(|x| x * 2)
.collect::<Vec<u8>>());
它不是在单个调用中,而是更干净,而且我认为是惯用的。

关于rust - 如何仅映射迭代器中的Some()值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64159569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com