我如何定义一个函数,如果迭代器中的每个值都为true,则返回true?

时间:2018-12-29 09:40:30

标签: rust iterator

我想定义一个带有迭代器的函数every,虽然它不是None,但要确保所有值都是true

示例应用程序:

every([true, true, true].into_iter()) == true
every([true, false, true].into_iter()) == false

我很难让它仅与Vec一起使用,更不用说Iterator了。我已经尝试了以下方法和一些变体,但是还没到任何地方。

use std::ops;

fn every<T>(v: Vec<T>) -> bool
where
    T: ops::Not,
{
    for item in v {
        match !item {
            T::No => return false,
        }
    }
    true
}

此代码得到错误:

error[E0599]: no associated item named `No` found for type `T` in the current scope
 --> src/lib.rs:9:13
  |
9 |             T::No => return false,
  |             ^^^^^ associated item not found in `T`

1 个答案:

答案 0 :(得分:3)

基于Stargateur's comment

的更通用的示例
fn every<T, I>(v: I) -> bool
where
    I: IntoIterator<Item = T>,
    T: std::ops::Not<Output = bool>,
{
    v.into_iter().all(|x| !!x)
}

playground

v可以是实现IntoIterator的任何东西,例如Vec,也可能是mapfilter之类的东西,这使得该解决方案非常通用。