在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
相关产品推荐
相关产品推荐

