You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Rust标准库或维护的crate中,是否存在可重复另一Iterator首尾元素的Iterator?

Rust 迭代器:重复首尾元素的实现方案
  • Rust标准库(std)中没有直接提供这种能重复首尾元素的迭代器适配器。
  • 维护活跃的第三方crate如itertools也没有专门对应此功能的方法,但可以通过其现有工具组合实现,或者自行编写迭代器适配器。

自行实现迭代器适配器

以下是完整的实现代码,包含扩展方法和测试用例:

use std::iter::{self, Iterator};

// 定义迭代器适配器结构体
struct RepeatFirstLast<I> {
    inner: I,
    first: Option<<I as Iterator>::Item>,
    state: State,
}

// 状态枚举,控制迭代流程
enum State {
    Start,    // 准备输出第一个重复元素
    Middle,   // 遍历原迭代器的中间元素
    End,      // 准备输出最后一个重复元素
    Done,     // 迭代完成
}

impl<I: Iterator> RepeatFirstLast<I>
where
    I::Item: Clone,
{
    fn new(iter: I) -> Self {
        RepeatFirstLast {
            inner: iter,
            first: None,
            state: State::Start,
        }
    }
}

// 实现Iterator trait
impl<I: Iterator> Iterator for RepeatFirstLast<I>
where
    I::Item: Clone,
{
    type Item = I::Item;

    fn next(&mut self) -> Option<Self::Item> {
        match self.state {
            State::Start => {
                self.first = self.inner.next();
                match &self.first {
                    Some(item) => {
                        self.state = State::Middle;
                        Some(item.clone())
                    }
                    None => {
                        self.state = State::Done;
                        None
                    }
                }
            }
            State::Middle => {
                let next_item = self.inner.next();
                match next_item {
                    Some(item) => Some(item),
                    None => {
                        self.state = State::End;
                        self.first.clone()
                    }
                }
            }
            State::End => {
                self.state = State::Done;
                None
            }
            State::Done => None,
        }
    }
}

// 为所有符合条件的迭代器添加扩展方法
trait RepeatFirstLastExt: Iterator
where
    Self::Item: Clone,
{
    fn repeat_first_and_last(self) -> RepeatFirstLast<Self> {
        RepeatFirstLast::new(self)
    }
}

impl<I: Iterator> RepeatFirstLastExt for I where I::Item: Clone {}

// 测试示例
fn main() {
    // 常规多元素迭代器
    let iter = [1, 2, 3].into_iter();
    assert!(iter.repeat_first_and_last().eq([1, 1, 2, 3, 3]));

    // 空迭代器
    let empty_iter: [i32; 0].into_iter();
    assert!(empty_iter.repeat_first_and_last().eq([]));

    // 单元素迭代器
    let single_iter = [5].into_iter();
    assert!(single_iter.repeat_first_and_last().eq([5, 5]));
}

使用itertools组合实现

借助itertools的into_position方法可以快速拆分出首尾元素,再组合成目标迭代器:

use itertools::Itertools;

fn repeat_first_and_last<I>(iter: I) -> impl Iterator<Item = I::Item>
where
    I: Iterator,
    I::Item: Clone,
{
    let (first, rest, last) = iter.into_position();
    match (first, last) {
        // 多元素情况:重复首元素 + 原首元素 + 中间元素 + 原尾元素
        (Some(f), Some(l)) => iter::once(f.clone()).chain(iter::once(f)).chain(rest).chain(iter::once(l)),
        // 单元素情况:重复两次该元素
        (Some(f), None) => iter::once(f.clone()).chain(iter::once(f)),
        // 空迭代器:返回空
        (None, _) => iter::empty(),
    }
}

// 测试
fn main() {
    let iter = [1, 2, 3].into_iter();
    assert!(repeat_first_and_last(iter).eq([1, 1, 2, 3, 3]));
}

内容的提问来源于stack exchange,提问作者Simplex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:30:01