首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能两次反转迭代器以得到向量的最后两个数字?

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

Stack Overflow用户
提问于 2018-12-15 20:00:49
回答 1查看 783关注 0票数 4

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

代码语言:javascript
复制
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
}

游乐场

错误消息是:

代码语言:javascript
复制
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`
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-16 00:55:22

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

性状约束Take<...>: DoubleEndedIterator不满意

只有在底层类型实现Iterator::Rev时才实现DoubleEndedIterator

代码语言:javascript
复制
fn rev(self) -> Rev<Self>
where
    Self: DoubleEndedIterator, 

Take不实现DoubleEndedIterator,因此不能在其上调用rev

我就把它切成碎片:

代码语言:javascript
复制
let items = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let last_2 = &items[items.len() - 2..];
assert_eq!(last_2, [8, 9]);
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53796779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档