我是新手,如果这个问题很幼稚,请原谅我。
我正在尝试在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()
}
}
游乐场