Как я могу определить функцию, которая возвращает истину, если каждое значение в итераторе истинно? - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу определить функцию 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 голосов
/ 29 декабря 2018

Более общий пример на основе комментария Stargateur

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

( детская площадка )

v может быть любым, что реализует IntoIterator, например Vec, но также что-то вроде map или filter, что делает это решение очень универсальным.

...