我可以在堆中创建一个消费迭代器:
vec![1, 10, 100].into_iter()
字符串
我也可以在栈上创建一个迭代器,借用元素:
[1, 10, 100].iter()
型
但如果我这样写:
[1, 10, 100].into_iter()
型
这不是一个消费迭代器,因为[T; _]::into_iter
不存在:IntoIterator
只为借用的版本(又名切片)实现。有没有一种简单的方法(最好在std
库中)在堆栈上创建一个消费迭代器?
我知道[1, 10, 100].iter().cloned()
可以做到,但这需要项目是可克隆的。
3条答案
按热度按时间svujldwt1#
有没有一种简单的方法(最好在
std
库中)在堆栈上创建一个消费迭代器?号
有没有一种简单的方法(最好是在std库中)在堆栈上创建一个消费迭代器?
是的。使用像
stack
或smallvec
这样的crate,它们提供了实现IntoIterator
的数组类型。kfgdxczn2#
Rust 1.53(2021版)
从Rust 2021 Edition开始,调用
into_iter()
on an array总是提供一个消费的按值迭代器。这意味着问题中提供的示例将按照最初的期望工作。字符串
Rust 1.53(其他版本)
在Rust 2015或2018版本中,上面的代码仍然会解析为
(&[1, 10, 100]).into_iter()
,但任何其他语法都将提供消费迭代器,无论版本如何。的数据
Rust 1.51
std::array::IntoIter
为数组提供了一个按值迭代器。这个API与const泛型的基线支持一起提供(参见Rust 1.51公告博客文章)。型
Rust < 1.51
你可以有一个宏,它将值 Package 在
once
迭代器中并将它们链接在一起:型
使用:
型
一个已知的缺点是迭代器不是一个精确大小的迭代器,因此编译器可能会错过一些明显的优化。
Playground的
rqenqsqc3#
非常丑陋,但技术上可行:
字符串
你可以使用一个宏,以更漂亮的方式实现这一点:
型