如何在堆栈上创建按值迭代器?

乙硫

我可以在堆中创建一个消耗迭代器:

vec![1, 10, 100].into_iter()

我还可以在借用元素的堆栈上创建一个迭代器:

[1, 10, 100].iter()

但是如果我这样写:

[1, 10, 100].into_iter()

这不是一个消耗量很大的迭代器,因为[T; _]::into_iter它不存在:IntoIterator仅针对借用版本(也称为切片)实现。是否有一种简单的方法(最好是在stdlib中)在堆栈上创建使用迭代器?


我知道这是[1, 10, 100].iter().cloned()可以做到的,但这要求物品是可克隆的。

E_net4发布模因

你可以有它包装的价值宏onceiterator和在一起:

macro_rules! value_iter {
    () => {
        std::iter::empty()
    };
    ($v: expr, $( $rest: expr ), +) => {
        std::iter::once($v).chain(
            value_iter!($($rest),*)
        )
    };
    ($v: expr) => {
        std::iter::once($v)
    };
}

使用:

#[derive(Debug, PartialEq)]
struct Foo;

let it = value_iter![Foo, Foo, Foo];

let all: Vec<_> = it.collect();
assert_eq!(all, vec![Foo, Foo, Foo]);

一个已知的缺点是迭代器不会是精确大小的迭代器,因此编译器可能会错过一些明显的优化。

操场

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章