移出盒装切片盒< [T]>

时间:2017-03-01 19:21:44

标签: rust

如何将元素移出盒装切片,在过程中消耗切片?

例如:

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,然后使用矢量。这将接近无操作性能,但有更优雅的方式吗?

1 个答案:

答案 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]>的实现。