在实现自定义IntoIterator特性时遇到麻烦



我是新手,如果这个问题很幼稚,请原谅我。

我正在尝试在rust中构建一个操作系统,我正在遵循本教程。操作系统还没有内存管理,所以我们的目标是构建一个像矢量一样的对象,它可以被推入和弹出等,但它存在于堆栈中。为此,我们使用固定大小的数组初始化它。它看起来像这样:

#[derive(Debug)]
pub struct StackVec<'a, T: 'a> {
storage: &'a mut [T],
len: usize
}
impl<'a, T: 'a> StackVec<'a, T> {
pub fn new(storage: &'a mut [T]) -> StackVec<'a, T> {
StackVec {
storage: storage,
len: 0,
}
}
pub fn with_len(storage: &'a mut [T], len: usize) -> StackVec<'a, T> {
if len > storage.len(){
panic!();
}
StackVec{
storage: storage,
len: len
}
}
pub fn capacity(&self) -> usize {
self.storage.len()
}
pub fn into_slice(self) -> &'a mut [T] {
&mut self.storage[0..self.len]
}

// Other functions which aren't relevant for the question.
}

弹出和压入操作增加和减少len变量,并从数组的适当位置添加和删除条目。

现在,我们还需要实现IntoIterator特性。考虑到StackVec包含对数组的引用,我认为我可以从底层数组返回一个迭代器:

impl <'a, T:'a> IntoIterator for StackVec<'a, T> {
type Item = T;
type IntoIter = core::array::IntoIter; // <- Throws "not found in `core::array"
fn into_iter(self) -> Self::IntoIter {
self.into_slice().into_iter()
}
}

但是不管我怎么摆弄它,它仍然不想编译。我找不到一种方法来表达使用类型,into_iter应该返回数组的迭代器。我做错了什么?

这里有不同的问题:

  • 您不能使用array::IntoIterator,因为您没有数组,您有切片,这是完全不同的。它可以解决,例如,通过使用适当的core::slice::Iter,如在示例中。
  • 您试图返回T,但实际上您只能访问&T,因此返回Item应该是&T
  • 你的into_slice方法使用了一个没有必要的&mut,你可以为这个实现重新切片存储
impl <'a, T:'a> IntoIterator for StackVec<'a, T> {
type Item = &'a T;
type IntoIter = core::slice::Iter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.storage[0..self.len].into_iter()
}
}

游乐场

最新更新