Получить длину TakeWhile? - PullRequest
       0

Получить длину TakeWhile?

0 голосов
/ 23 января 2020

Я хочу использовать take_while на итераторе, а затем посчитать, сколько элементов в полученном итераторе. Вот простая игрушечная программа, которая демонстрирует, что я пытаюсь сделать:

fn main() {
    let v = vec![1, 2, 3, 4, 5, 4, 3];
    let num_before_five = v.iter().take_while(|&&x| x != 5).len();
    println!("There are {} items before 5 occurs.", num_before_five);
}

(площадка Rust)

Когда я пытаюсь скомпилировать это, я получаю следующая ошибка:

error[E0599]: no method named `len` found for type `std::iter::TakeWhile<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:3:47: 3:59]>` in the current scope
 --> src/main.rs:3:61
  |
3 |     let num_before_five = v.iter().take_while(|&&x| x != 5).len();
  |                                                             ^^^ method not found in `std::iter::TakeWhile<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:3:47: 3:59]>`

Ошибка предполагает, что std::iter::TakeWhile не имеет .len() метода, который является истинным. Хотя произвольный итератор может никогда не завершиться, так как этот происходит от Vec, я знаю, что он конечен. Я мог бы получить длину, считая ее в for l oop, но, похоже, должен быть более идиоматический c способ сделать это в Rust.

Как я могу получить длину этого TakeWhile?

1 Ответ

4 голосов
/ 23 января 2020

Вы хотите Iterator::count:

fn main() {
    let v = vec![1, 2, 3, 4, 5, 4, 3];
    let num_before_five = v.iter().take_while(|&&x| x != 5).count();
    println!("There are {} items before 5 occurs.", num_before_five);
}

Имейте в виду, это O(n). OTOH, len доступно только для ExactSizeIterator, а TakeWhile - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...