簡體   English   中英

無法實現自定義 IntoIterator 特性

[英]Trouble implementing custom IntoIterator trait

我是 rust 的新手,如果問題很幼稚,請原諒我。

我正在嘗試在 rust 中構建操作系統,並且我正在學習教程。 操作系統還沒有 memory 管理,所以目標是構建一個 object,它就像一個向量,可以被壓入和彈出等,但它存在於堆棧中。 我們通過用一個固定大小的數組初始化它來做到這一點。 它看起來像這樣:

#[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的訪問權限,因此 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()
    }
}

操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM