迭代`Box<[T]>`

问题描述 投票:0回答:1

如何迭代

Box<[T]>
而不克隆所包含的项目?

此代码无法编译,因为“

[T]
不是迭代器”:

let boxed_slice: Box<[T]> = …;
for item in boxed_slice {
    // item: T
}

for item in *boxed_slice
无法编译,因为“在编译时无法知道
[T]
类型的值的大小”。

for item in &*boxed_slice
中,该项目是参考。

rust iterator smart-pointers box
1个回答
0
投票

我想出了这段代码,但也许标准库中有一些我忽略的东西,所以我不需要使用不安全的代码?

struct BoxIter<T> {
    data: Box<[ManuallyDrop<T>]>,
    pos: usize,
}

impl<T> BoxIter<T> {
    fn new(data: Box<[T]>) -> Self {
        Self {
            data: unsafe { std::mem::transmute(data) },
            pos: 0,
        }
    }
}

impl<T> Drop for BoxIter<T> {
    fn drop(&mut self) {
        for i in self.pos..self.data.len() {
            unsafe { ManuallyDrop::drop(&mut self.data[i]) };
        }
    }
}

impl<T> Iterator for BoxIter<T> {
    type Item = T;

    fn next(&mut self) -> Option<Self::Item> {
        let datum = unsafe { ManuallyDrop::take(self.data.get_mut(self.pos)?) };
        self.pos += 1;
        Some(datum)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.