【问题标题】:Shorten iterator by condition in rust按生锈条件缩短迭代器
【发布时间】:2022-12-11 02:49:16
【问题描述】:

我正在寻找某种方法来根据某些条件缩短迭代器。有点像逆向过滤器,但它在第一个真值处停止迭代。我们称它为until(f)。在哪里:

iterator.until(f)

将返回一个迭代器,它只运行到 f 为真一次。

让我们用一个寻找下一个质数的例子。

我们有一些包含已知素数的结构和一个扩展它的函数。

// Structure for caching known prime numbers
struct PrimeGenerator {
    primes:Vec<i64>
}

impl PrimeGenerator {

    // Create a new prime generator
    fn new()->Self{
        let primes = vec![2,3];
        Self {
            primes,
        }
    }
    
    // Extend the list of known primes by 1
    fn extend_by_one(&mut self){
        let mut next_option = self.primes.last().unwrap()+2;
        while self.iter().all(|x| next_option%x != 0) { // This is the relevant line
            next_option += 2;
        }
        self.primes.push(next_option);
    }

}

现在这个 sn-p 有点太详尽了,因为我们只需要检查 next_option 的平方根,所以我正在寻找一种可以根据某些条件缩短迭代器的方法,所以我可以写一些类似的东西:

self.iter().until(|x| x*x > next_option).all(|x| next_option%x != 0)

有没有类似的模式可用?

【问题讨论】:

  • 你是说take_while?在询问这些琐碎的事情之前,请先阅读Iterator 的文档。
  • @cafce25 虽然这是一个微不足道的问题,但我认为它有其目的,因为 SO 的主要目标是成为一个巨大的问答。
  • 是的,问答不是文档的副本。做研究显然是在这里提问的先决条件之一。阅读有关 imo 问题的项目的文档是其中的重要组成部分。话虽这么说,但我认为这并不是特别糟糕,并且期望名字 until 可能会忽略 take_while。这就是为什么我没有投票。 @Finomnis
  • @cafce25 我同意这一点。
  • @cafce25 无论哪种方式,我都会创建一个答案,但我无法创建示例,因为给定的代码不完整。 PrimeGenerator 没有实现 .iter()。所以我会投票关闭不完整。

标签: dictionary rust filter iterator


【解决方案1】:

看起来你的until 类似于反转的take_while。

self.iter().take_while(|x| x*x <= next_option).all(|x| next_option%x != 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 2018-05-16
    • 2023-04-09
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多