gpt4 book ai didi

Rust:如何过滤掉 "None"排放?

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

我的用例是我想扫描一个迭代器,并在原始迭代器的段上产生累积值(这是一个标记器)。换句话说,它不是输入值和输出值之间的一对一映射。请注意 filter_map()不会工作,因为我确实需要累加器值。
我找到了 .scan() ,这几乎是我想要的:

#![allow(unused)]
fn main() {
let a = [1, 2, 3];

let mut iter = a.iter().scan(1, |state, &x| {
if x == 2 {
return None;
}

// each iteration, we'll multiply the state by the element
*state = *state * x;

// then, we'll yield the negation of the state
Some(-*state)
});

println!("{:?}", &iter.next());
println!("{:?}", &iter.next());
println!("{:?}", &iter.next());
}
除了以上输出
Some(-1)
None
Some(-3)
当我想要它输出时
Some(-1)
Some(-3)
None
而且,不管你怎么想,这都行不通:
        Some(-*state)
}).filter(|x| x.is_some());

因为我实际上并没有迭代 Option s:
error[E0599]: no method named `is_some` found for reference `&{integer}` in the current scope
--> src/main.rs:15:21
|
15 | }).filter(|x| x.is_some());
| ^^^^^^^ method not found in `&{integer}`
所以这就像迭代器方法被故意屏蔽在“缺少屈服值”的情况下。
我有什么想法可以 a) 过滤掉那些缺失的产量,或者 b) 以某种完全不同的方式完成上述任务?

最佳答案

您可以使用 filter_map并在迭代器外部的变量中创建自己的累加器:

fn main() {
let a = [1, 2, 3];

let mut state = 1;

let mut iter = a.iter().filter_map(|&x| {
if x == 2 {
return None;
}

// each iteration, we'll multiply the state by the element
state = state * x;

// then, we'll yield the negation of the state
Some(-state)
});

println!("{:?}", &iter.next()); // Some(-1)
println!("{:?}", &iter.next()); // Some(-3)
println!("{:?}", &iter.next()); // None
}

关于Rust:如何过滤掉 "None"排放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63145397/

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