如何将元素移出盒装切片,在过程中消耗切片?
例如:
struct T(u32); // No Copy implementation
fn consume(t: T) { /* ... */ }
fn main() {
let v = vec![T(1), T(2)];
let s = v.into_boxed_slice();
// Get a Box<[T]> from somewhere and consume it:
for t in s {
consume(t);
}
}
导致编译器错误“std::iter::Iterator
未实现特征[T]
”。
当然,我可以使用s.into_vec()
从盒装切片构造Vec
,然后使用矢量。这将接近无操作性能,但有更优雅的方式吗?
答案 0 :(得分:2)
在稳定的Rust中可以做的最好的事情就是将其转换为Vec
:
let v = Vec::from(s);
for t in v {
consume(t);
}
我认为这不会对性能造成任何负面影响,因为转换为Vec
基本上会增加一个usize
。
Nightly Rust的array::IntoIter
支持直接在数组上进行迭代,因此您应该能够将其转换为Box<[T; N]>
并使用它。
您可能还可以提交PR,为Iterator
添加Box<[T]>
的实现。