Rust 如何在结构中的数组块上实现迭代器?

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

我想为结构实现一个迭代器,其中一个字段是数组。迭代器应该返回该数组的一个片段,但这需要一个生存期参数。这个参数应该放在哪里

生锈的版本是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) } }
当您从函数返回引用时,它的生存期需要与其他内容绑定。否则,编译器将不知道引用的有效期有多长(例外情况是
的静态
生存期,它将持续整个程序)

所以我们需要一个现有的切片引用。一种标准方法是将引用绑定到迭代器本身。比如说,

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>())
    }
}