我知道Lifetime in Iterator impl,但我想了解更多的细节来帮助我正确理解。迭代器返回自己的引用
我想写一个无限Iterator
,返回&[0]
,&[0, 1]
,&[0, 1, 2]
等。我想这样写:
struct Countings(Vec<usize>);
impl Countings {
fn new() -> Countings { Countings(vec![]) }
}
impl Iterator for Countings {
type Item = &[usize];
fn next(&mut self) -> Option<Self::Item> {
self.0.push(self.0.len());
Some(self.0.as_slice())
}
}
我不能因为类型Countings::Item
没有一辈子。
error[E0106]: missing lifetime specifier
--> src/lib.rs:8:17
|
8 | type Item = &[usize];
| ^expected lifetime parameter
所以我加一个。它必须受impl Iterator
的约束。这反过来需要在struct Countings
上有一个生命周期参数。到目前为止,我在这里:
struct Countings<'a>(Vec<usize>);
impl<'a> Countings<'a> {
fn new() -> Countings<'a> { Countings(vec![]) }
}
impl<'a> Iterator for Countings<'a> {
type Item = &'a [usize];
fn next(&mut self) -> Option<Self::Item> {
self.0.push(self.0.len());
Some(self.0.as_slice())
}
}
现在我有一个不同的错误:
error[E0392]: parameter `'a` is never used
--> src/lib.rs:1:18
|
1 | struct Countings<'a>(Vec<usize>);
| ^^
|
= help: consider removing `'a` or using a marker such as `std::marker::PhantomData`
我好好考虑一下:
use std::marker::PhantomData;
struct Countings<'a>(Vec<usize>, PhantomData<&'a [usize]>);
impl<'a> Countings<'a> {
fn new() -> Countings<'a> { Countings(vec![], PhantomData) }
}
impl<'a> Iterator for Countings<'a> {
type Item = &'a [usize];
fn next(&mut self) -> Option<Self::Item> {
self.0.push(self.0.len());
Some(self.0.as_slice())
}
}
但无济于事:
error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
--> src/lib.rs:14:25
|
14 | Some(self.0.as_slice())
| ^^^^^^^^
问题1:什么是“冲突的要求s“吗?
问题2:answer cited above表示Item
必须借用Iterator
包装的东西。我已阅读std::slice::Windows
的来源,这是一个很好的例子。然而,在我的情况下,我想要改变Vec
每次调用next()
。那可能吗?
谢谢。你的答案有一些有用的东西。如果我能接受这两个答案,但我认为弗朗西斯的回答更好地集中在我的两个问题上。 – apt1002