Почему я не могу дважды повернуть итератор, чтобы получить последние два числа вектора? - PullRequest
0 голосов
/ 15 декабря 2018

Я хочу взять последние два числа вектора.Почему я не могу повернуть итератор дважды?

fn main() {
    let double_reversed = &vec![1, 2, 3, 4, 5, 6, 7, 8, 9]
        .into_iter()
        .rev()
        .take(2)
        .rev()
        .collect();

    println!("{}", double_reversed); // expected 8, 9
}

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

Сообщения об ошибках:

error[E0277]: the trait bound `std::iter::Take<std::iter::Rev<std::vec::IntoIter<{integer}>>>: std::iter::DoubleEndedIterator` is not satisfied
 --> src/main.rs:6:10
  |
6 |         .rev()
  |          ^^^ the trait `std::iter::DoubleEndedIterator` is not implemented for `std::iter::Take<std::iter::Rev<std::vec::IntoIter<{integer}>>>`

error[E0599]: no method named `collect` found for type `std::iter::Rev<std::iter::Take<std::iter::Rev<std::vec::IntoIter<{integer}>>>>` in the current scope
 --> src/main.rs:7:10
  |
7 |         .collect();
  |          ^^^^^^^
  |
  = note: the method `collect` exists but the following trait bounds were not satisfied:
          `std::iter::Rev<std::iter::Take<std::iter::Rev<std::vec::IntoIter<{integer}>>>> : std::iter::Iterator`
          `&mut std::iter::Rev<std::iter::Take<std::iter::Rev<std::vec::IntoIter<{integer}>>>> : std::iter::Iterator`

1 Ответ

0 голосов
/ 16 декабря 2018

Как говорит вам компилятор (вычистил):

предел черты Take<...>: DoubleEndedIterator не удовлетворен

Iterator::Rev isреализуется только тогда, когда базовый тип реализует DoubleEndedIterator:

fn rev(self) -> Rev<Self>
where
    Self: DoubleEndedIterator, 

Take не реализует DoubleEndedIterator, поэтому вы не можете вызвать rev для него.


Я бы просто нарезал его:

let items = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let last_2 = &items[items.len() - 2..];
assert_eq!(last_2, [8, 9]);
...