如何在Rust中基于条件用另一迭代器元素替换迭代器元素?
问题描述
我正在寻找一种迭代器适配器,它能基于某个断言函数,有条件地用次级输入迭代器的元素替换主输入迭代器的元素,从而将两个输入迭代器的元素组合(多路复用)起来。示例迭代器实现如下:
struct MuxIter<A, B, F> { primary: A, // 主输入迭代器 secondary: B, // 次级输入迭代器 predicate: F, // 决定从哪个迭代器产出值的断言函数 } impl<A, B, F, T> Iterator for MuxIter<A, B, F> where A: Iterator<Item = T>, B: Iterator<Item = T>, F: Fn(&T) -> bool, { type Item = T; #[rustfmt::skip] fn next(&mut self) -> Option<Self::Item> { let elem = self.primary.next()?; // 先从主迭代器获取下一个元素 if (self.predicate)(&elem) { // 检查是否满足断言... Some(elem) // 满足则产出该元素 } else { self.secondary.next() // 不满足则产出次级迭代器的下一个元素 } } }
请问标准库(std)或第三方crate中是否存在这类迭代器?
回答
Rust标准库中没有直接提供这种逻辑的迭代器适配器,因为它的行为比较特定:严格以主迭代器的元素数量为基准,对每个主元素做判断后选择保留自身或取用次级迭代器的对应元素。
在第三方crate中,目前也没有完全匹配该逻辑的现成适配器,但你可以直接使用自己实现的MuxIter——它的实现已经简洁且完全符合需求。如果想借助现有crate简化实现,可以考虑itertools:通过primary.zip(secondary)将两个迭代器配对,再用map结合断言函数选择元素,但这种方式要求两个迭代器长度一致,和你的实现逻辑(主迭代器耗尽则停止,不管次级迭代器剩余)略有区别,需要根据实际场景调整。
内容的提问来源于stack exchange,提问作者RBF06
相关产品推荐
相关产品推荐

