Rust 如何在结构中的数组块上实现迭代器?
我想为结构实现一个迭代器,其中一个字段是数组。迭代器应该返回该数组的一个片段,但这需要一个生存期参数。这个参数应该放在哪里 生锈的版本是1.37.0 结构A{ 答:[u8;100], num:usize, } 函数的impl迭代器{ type Item=&[u8];//这需要一个生存期参数,但没有声明任何参数 fn下一步(&mut self)->选项{ 如果self.num>=10{ 不返回任何值; } 设res=&self.a[10*self.num..10*(self.num+1)]; self.num+=1; 一些(res) } }Rust 如何在结构中的数组块上实现迭代器?,rust,iterator,lifetime,Rust,Iterator,Lifetime,我想为结构实现一个迭代器,其中一个字段是数组。迭代器应该返回该数组的一个片段,但这需要一个生存期参数。这个参数应该放在哪里 生锈的版本是1.37.0 结构A{ 答:[u8;100], num:usize, } 函数的impl迭代器{ type Item=&[u8];//这需要一个生存期参数,但没有声明任何参数 fn下一步(&mut self)->选项{ 如果self.num>=10{ 不返回任何值; } 设res=&self.a[10*self.num..10*(self.num+1)]; se
当您从函数返回引用时,它的生存期需要与其他内容绑定。否则,编译器将不知道引用的有效期有多长(例外情况是
的静态生存期,它将持续整个程序)
所以我们需要一个现有的切片引用。一种标准方法是将引用绑定到迭代器本身。比如说,
struct Iter<'a> {
slice: &'a [u8; 100],
num: usize,
}
由于寿命省略,iter
上的寿命可以省略:
impl Data {
fn iter(&self) -> Iter {
Iter {
slice: &self.array,
num: 0,
}
}
}
就几张便条。[0u8;100]
有一个编译器错误。这可能是对[u8;100]
的输入错误,但为了以防万一,我们不能这样做。在结构定义的字段中,仅指定类型。字段或类似的内容没有默认值。如果您试图为结构体设置默认值,请考虑使用.< /P>
其次,您可能知道这一点,但是已经有了一个用于切片的块迭代器。如果slice
是一个切片(或者可以被强制为切片-向量和数组是主要示例),那么slice.chunks(n)
是该切片中长度为n
的块的迭代器。我在上面链接的代码中给出了一个例子。有趣的是,该实现使用了一个非常类似的思想:slice.chunks(n)返回一个带有生存期参数的新结构,并实现了迭代器。这几乎与我们的Data::iter
完全相同
最后,您的next
实现中有一个bug,在运行时会导致越界恐慌。看看你能不能发现它 我不会实现我自己的。相反,我将重用现有迭代器,并:
结构A{
答:[u8;100],
num:usize,
}
impl;
fn进入iter(self)->self::进入iter{
self.a.chunks(self.num)
}
}
fn示例(a:a){
用于&a中的块{
println!(“{}”,chunk.iter().sum::())
}
}
感谢您详尽完整的回答。我非常感谢。我对问题进行了编辑,以消除提到的bug。
struct Data {
array: [u8; 100],
}
impl Data {
fn iter<'a>(&'a self) -> Iter<'a> {
Iter {
slice: &self.array,
num: 0,
}
}
}
impl Data {
fn iter(&self) -> Iter {
Iter {
slice: &self.array,
num: 0,
}
}
}
struct A {
a: [u8; 100],
num: usize,
}
impl<'a> IntoIterator for &'a A {
type Item = &'a [u8];
type IntoIter = std::slice::Chunks<'a, u8>;
fn into_iter(self) -> Self::IntoIter {
self.a.chunks(self.num)
}
}
fn example(a: A) {
for chunk in &a {
println!("{}", chunk.iter().sum::<u8>())
}
}