我正在try 从迭代器中删除一些外部可变状态
fn main() {
let non_increasing: Vec<i32> = vec![1, 0, 2, 6, 3, 9];
let mut max_so_far = 0;
for val in non_increasing
.iter()
.filter(|&&height| if height > max_so_far {max_so_far = height; true} else {false})
{
println!("{val}")
}
}
# output
# 1
# 2
# 6
# 9
我已经发现我可以做到这一点使用scan
,但这使得应用filter
非常困难.在这种情况下,我只对正数感兴趣,所以有一种方法可以绕过它(尽管这种方法可以工作,只要你可以确定任何给定的硬编码值,例如i32::MIN
不会出现).
fn main() {
let non_increasing: Vec<i32> = vec![1, 0, 2, 6, 3, 9];
for val in non_increasing
.iter()
.scan(0, |max_so_far, &x|{
if x > *max_so_far {
*max_so_far = x;
Some(x)
} else {
Some(i32::MIN)
}
})
.filter(|&x| x != i32::MIN)
{
println!("{val}")
}
}
# output
# 1
# 2
# 6
# 9
然而,我想要一种不只是黑客的方式来做这件事,沿着以下路由
fn main() {
let non_increasing: Vec<i32> = vec![1, 0, 2, 6, 3, 9];
for val in non_increasing
.iter()
.scan_filter(0, |max_so_far, &x|{
if x > *max_so_far {
*max_so_far = x;
(true, Some(x))
} else {
(false, Some(x))
}
})
{
println!("{val}")
}
}
# output
# 1
# 2
# 6
# 9
我怎么能这样做呢?