有比“vec![a,b,c] .into_iter()”更好的创建临时迭代器的方法吗?

4

vec![a, b, c].into_iter() 这个表达式看起来有点冗长,有更好的写法吗?

itertools 的文档 kmerge 给出了以下示例:

use itertools::Itertools;

let a = (0..6).step(3);
let b = (1..6).step(3);
let c = (2..6).step(3);
let it = vec![a, b, c].into_iter().kmerge();
itertools::assert_equal(it, vec![0, 1, 2, 3, 4, 5]);

当你想要创建一个临时的值迭代器时,有没有更好的方法? 也许像 iter![a,b,c] 这样的东西(如果 iter 已被使用,则使用其他单词)。 如果这是可能的,我相信肯定已经有人做过了,但我找不到任何相关资料。

1
请注意,如果您正在编写一个 for 循环,那么 .into_iter() 调用将是隐式的,因此您可以省略它(并且删除 vec!,因为它可以只是一个简单的数组)。只有当您需要显式转换为迭代器时,它才会变得更加冗长。 - ShadowRanger
2个回答

4
一个数组和 Vec 一样好用,而且避免了堆分配。
[a, b, c].into_iter()

也许这份文档是在 Rust 1.53 发布之前编写的,当时这个功能还没有稳定化


1
示例代码肯定比较老;Itertools.step已经被弃用超过四年了,现在推荐使用std::iter提供的.step_by,因此该示例代码早于2018年12月。 - ShadowRanger

0

感谢所有的帮助!把所有东西放在一起,我们可以让 [a, b, c].kmerge() 正常工作:

    use itertools::Itertools;

    let a = (0..6).step_by(3);
    let b = (1..6).step_by(3);
    let c = (2..6).step_by(3);
    let it = [a, b, c].kmerge();
    itertools::assert_equal(it, [0, 1, 2, 3, 4, 5]);

额外的一步是扩展所有IntoIterator的功能:

use itertools::kmerge;
use itertools::KMerge;

impl<I: IntoIterator> IntoItertoolsPlus for I {}
pub trait IntoItertoolsPlus: IntoIterator {
    fn kmerge(self) -> KMerge<<Self::Item as IntoIterator>::IntoIter>
    where
        Self: IntoIterator + Sized,
        Self::Item: IntoIterator,
        <<Self as IntoIterator>::Item as IntoIterator>::Item: PartialOrd,
    {
        kmerge(self)
    }
}

我将会在我的两个函数中使用这个方法。它们都接受同类型的可变数量输入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接