我正在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

我怎么能这样做呢?

推荐答案

你可以利用Option<T>IntoIterator的事实:

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(Some(x))
            } else {
                Some(None)
            }
        })
        .flatten()
    {
        println!("{val}")
    }
}

Rust相关问答推荐

如何在不安全的代码中初始化枚举 struct

在actix—web中使用Redirect或NamedFile响应

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

制作一片连续整数的惯用Rust 方法?

无法从流中读取Redis请求

S,一般性状和联想型性状有什么不同?

重写Rust中的方法以使用`&;mut self`而不是`mut self`

在文件链实施中绕过borrow 判断器

Rust移动/复制涉及实际复制时进行检测

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

Windows 上 ndarray-linalg 与 mkl-stats 的链接时间错误

从 rust 函数返回 &HashMap

Rust:`sort_by` 多个条件,冗长的模式匹配

&self 参数在 trait 的功能中是必需的吗?

内部值发生变化时 Rc 的行为

在每个循环迭代中删除borrow

我的 Axum 处理程序无法编译:未实现 IntoResponse 特征

Rust 中 `Option` 的内存开销不是常量

TcpStream::connect - 匹配武器具有不兼容的类型

深度嵌套枚举的清洁匹配臂