无法实现自定义 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()
}
}
我是 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
的访问权限,因此 returnItem
应该是&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()
}
}