rust 有没有比“vec![a,B,c].into_iter()"更好的创建临时迭代器的方法?

du7egjpx  于 2023-02-19  发布在  其他
关注(0)|答案(2)|浏览(115)

表达式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被取出来,那么就换个词)。如果这是可能的,我不得不相信有人已经做过了,但是我找不到任何东西。

vxf3dgd4

vxf3dgd41#

数组与Vec工作得一样好,并且避免了堆分配。

[a, b, c].into_iter()

也许文档早于Rust 1.53稳定时的版本。

ddarikpa

ddarikpa2#

感谢所有的帮助!把所有这些放在一起,我们可以使[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)
    }
}

我将在我自己的两个函数中使用这个方法,它们都接受不同数量的相同类型的输入。

相关问题