我可以在堆中创建一个消耗迭代器:
vec![1, 10, 100].into_iter()
我还可以在借用元素的堆栈上创建一个迭代器:
[1, 10, 100].iter()
但是如果我这样写:
[1, 10, 100].into_iter()
这不是一个消耗量很大的迭代器,因为[T; _]::into_iter
它不存在:IntoIterator
仅针对借用版本(也称为切片)实现。是否有一种简单的方法(最好是在std
lib中)在堆栈上创建使用迭代器?
我知道这是[1, 10, 100].iter().cloned()
可以做到的,但这要求物品是可克隆的。
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] 删除。
我来说两句