无法实现自定义 IntoIterator 特性

Trouble implementing custom IntoIterator trait

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

我正在尝试用 Rust 构建一个 OS,我正在学习 this 教程。 OS 还没有内存管理,所以目标是构建一个类似于向量的对象,因为它可以被压入和弹出等,但它存在于堆栈中。我们通过用一个固定大小的数组初始化它来做到这一点。它看起来像这样:

#[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 包含对数组的引用,我认为我可以 return 来自底层数组的迭代器:

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 应该 return 数组迭代器的类型。我做错了什么?

这里有不同的问题:

  • 你不能使用array::IntoIterator因为你没有数组,你有一个切片,这是很不一样的。例如,可以通过使用示例中的正确 core::slice::Iter 来解决。
  • 您正在尝试 return T 但实际上您只授予 &T 的访问权限,因此 return 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()
    }
}

Playground