首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建一个iter重复锈蚀中的最后一个元素

如何创建一个iter重复锈蚀中的最后一个元素
EN

Stack Overflow用户
提问于 2020-02-17 11:47:36
回答 2查看 588关注 0票数 0

如何创建一个iter重复最后一个元素?

例如:

[1, 2, 3] => [1, 2, 3, 3, 3, ...]

我的尝试

代码语言:javascript
复制
fn main() {
    let v = vec![1, 2, 3];
    let mut vi = v.iter().chain(repeat(v[v.len()]));
    println!("{}", vi.next().unwrap())
}
代码语言:javascript
复制
error[E0271]: type mismatch resolving `<std::iter::Repeat<{integer}> as std::iter::IntoIterator>::Item == &{integer}`
   --> projects\notedown-ast\src\traits\to_html.rs:120:27
    |
120 |     let mut vi = v.iter().chain(repeat(v[v.len()]));
    |                           ^^^^^ expected integer, found `&{integer}`

error[E0599]: no method named `next` found for struct `std::iter::Chain<std::slice::Iter<'_, {integer}>, std::iter::Repeat<{integer}>>` in the current scope
   --> projects\notedown-ast\src\traits\to_html.rs:121:23
    |
121 |     println!("{}", vi.next().unwrap())
    |                       ^^^^ method not found in `std::iter::Chain<std::slice::Iter<'_, {integer}>, std::iter::Repeat<{integer}>>`
    |
    = note: the method `next` exists but the following trait bounds were not satisfied:
            `std::iter::Chain<std::slice::Iter<'_, {integer}>, std::iter::Repeat<{integer}>> : std::iter::Iterator`

error: aborting due to 2 previous errors
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-17 11:59:54

v.iter()是引用的迭代器,而repeat是值本身的迭代器。另外,向量的最后一个元素是v[v.len() - 1]

为了使它发挥作用:

代码语言:javascript
复制
use std::iter::repeat;

fn main() {
    let v = vec![1, 2, 3];
    let mut vi = v.iter().chain(repeat(&v[v.len() - 1]));
    println!("{}", vi.nth(10).unwrap());
}
票数 2
EN

Stack Overflow用户

发布于 2020-02-17 14:06:08

以下是一个通用的实现:

代码语言:javascript
复制
struct LastRepeatIter<I>
where
    I: Iterator,
    I::Item: Clone,
{
    it: I,
    next: Option<I::Item>,
    last: bool,
}

impl<I> LastRepeatIter<I>
where
    I: Iterator,
    I::Item: Clone,
{
    fn new<It>(it: It) -> Self
    where
        It: IntoIterator<IntoIter = I, Item = I::Item>,
    {
        LastRepeatIter {
            it: it.into_iter(),
            next: None,
            last: false,
        }
    }
}

impl<I> Iterator for LastRepeatIter<I>
where
    I: Iterator,
    I::Item: Clone,
{
    type Item = I::Item;

    fn next(&mut self) -> Option<Self::Item> {
        if !self.last {
            match self.it.next() {
                None => self.last = true,
                Some(next) => self.next = Some(next),
            }
        }

        self.next.clone()
    }
}

#[test]
fn it_works() {
    let mut it = LastRepeatIter::new(vec![1, 2, 3]);

    assert_eq!(it.next(), Some(1));
    assert_eq!(it.next(), Some(2));
    assert_eq!(it.next(), Some(3));
    assert_eq!(it.next(), Some(3));
    assert_eq!(it.next(), Some(3));
}

在每次迭代时,代码检查是否有下一项:

  • (如果有),下一步存储在next字段中,
  • (如果没有),last标志为true。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60261769

复制
相关文章

相似问题

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