[英]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.