#迭代器 #适配器 #交错 #交替

alternating-iter

提供一种迭代器适配器,可以在两个迭代器之间交替迭代

3 个不稳定版本

0.3.1 2024年6月26日
0.3.0 2024年6月26日
0.2.0 2023年6月22日
0.1.2 2023年6月22日

#357 in Rust 模式

每月 31 次下载

MIT-0 许可证

39KB
759

交替迭代器

Latest Version

这个 crate 旨在提供一个方便的方法,在两个迭代器的项目之间交替。它允许您以交替的方式迭代两个迭代器,将它们的元素组合成一个单一序列。

为了最简单地使用这个 crate,将 AlternatingExt trait 带入作用域

use alternating_iter::AlternatingExt;

并使用 alternate_with_all 方法创建新的交替迭代器。

use alternating_iter::AlternatingExt;

let a = [1, 2];
let b = [3, 4, 5];

let mut iter = a.iter().alternate_with_all(b.iter());

assert_eq!(iter.next(), Some(&1)); // `a` first
assert_eq!(iter.next(), Some(&3)); // `b`
assert_eq!(iter.next(), Some(&2)); // `a`
assert_eq!(iter.next(), Some(&4)); // `b`
assert_eq!(iter.next(), Some(&5)); // also `b`
assert_eq!(iter.next(), None);

默认情况下,alternate_with_all 方法创建一个迭代器,首先从 a 返回一个元素,然后是来自 b 的一个元素,依此类推,直到两者都用完。

在耗尽后停止

然而,如果您希望迭代在任一迭代器耗尽时停止,可以使用由 AlternatingExt trait 提供的 alternate_with_no_remainder 方法。此方法返回一个迭代器,在需要从单个迭代器连续返回多个项目时停止。

use alternating_iter::AlternatingExt;

let a = [1, 2];
let b = [3, 4, 5];

let mut iter = a.iter().alternate_with_no_remainder(b.iter());

assert_eq!(iter.next(), Some(&1)); // `a` first
assert_eq!(iter.next(), Some(&3)); // `b`
assert_eq!(iter.next(), Some(&2)); // `a`
assert_eq!(iter.next(), Some(&4)); // `b`
assert_eq!(iter.next(), None);     // remaining items from `b` are not returned

迭代在第四个元素后停止,因为从 b 返回第五个元素会破坏交替模式。

耗尽后继续交替

如果 alternate_with_all 的行为不可取,并且您希望在迭代器耗尽后继续交替,请使用三个迭代器中最简单的一个:alternate_with

use alternating_iter::AlternatingExt;

let a = [1, 2];
let b = [3, 4, 5];

let mut iter = a.iter().alternate_with(b.iter());

assert_eq!(iter.next(), Some(&1)); // `a` first
assert_eq!(iter.next(), Some(&3)); // `b`
assert_eq!(iter.next(), Some(&2)); // `a`
assert_eq!(iter.next(), Some(&4)); // `b`
assert_eq!(iter.next(), None);     // `a` exhausted
assert_eq!(iter.next(), Some(&5)); // `b`
assert_eq!(iter.next(), None);     // `b` exhausted

迭代器将简单地盲目交替,因此如果其中一个输入迭代器比另一个大,则 Some 可以出现在 None 之间。

变更日志

  • 0.2: 重命名扩展 trait 中的方法,并修复了错误的 FusedIterator 实现
  • 0.3: 移除了错误的 FixedSizedIterator 实现

没有运行时依赖