functional-programming - 为什么我不能反转迭代器两次以获得向量的最后两个数字?

标签 functional-programming rust iterator

我想获取向量的最后两个数字。为什么我不能反转迭代器两次?

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
}

playground

错误信息是:

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`

最佳答案

正如编译器告诉您的(已清理):

the trait bound Take<...>: DoubleEndedIterator is not satisfied

Iterator::Rev 仅在基础类型实现 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]);

关于functional-programming - 为什么我不能反转迭代器两次以获得向量的最后两个数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53796779/

相关文章:

functional-programming - 多参数和嵌套函数的函数组合

string - 如何将单元素字符串转换为字符?

rust - 如何取消引用 Uuid 类型?

rust - 在 Result<Option<T>> 的情况下简化 Rust 中的错误处理

c++ - 无法访问 vector 中的整数

javascript - Ramda 通过链调用传递 "Maybe"错误消息

java - 如何在 Java8 中强制立即对流进行评估

scala - 为什么调用这样的函数在 Scala 中有效?

c++ - 嵌套迭代器循环,为什么迭代器相等? -C++

c++ - 我可以在环中实现迭代器 end() 吗?