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
中,该项目是参考。
我想出了这段代码,但也许标准库中有一些我忽略的东西,所以我不需要使用不安全的代码?
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)
}
}