Могу ли я написать итератор, который мутирует сам, а затем выдает ссылку на себя?
Я столкнулся с проблемой, которая упрощается в следующем:
struct MyIter {
vec: Vec<i8>,
}
fn fill_with_useful_data(v: &mut Vec<i8>) {
/* ... */
}
impl<'a> Iterator for MyIter {
type Item = &'a [i8];
fn next(&mut self) -> Option<&'a [i8]> {
fill_with_useful_data(&mut self.vec);
Some(&self.vec)
}
}
fn main() {
for slice in (MyIter { vec: Vec::new() }) {
println!("{}", slice);
}
}
Это генерирует ошибку:
error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
--> src/main.rs:9:6
|
9 | impl<'a> Iterator for MyIter {
| ^^ unconstrained lifetime parameter
Идея состоит в том, что итератор выполняет кучу работы, которая отражается в его полях, и на каждом шаге он возвращает ссылку на себя в вызывающий код. В этом случае я мог бы смоделировать это как получение копии состояния вместо ссылки, но давайте представим, что это невозможно или просто неудобно дорого.
Интуитивно понятно, что это не должно быть проблемой, потому что контролер заимствований может гарантировать, что.next()
не вызывается снова, в то время как полученная ссылка все еще может использоваться для проверки состояния итератора, ноIterator
черта, кажется, не обеспечивает такого рода вещи напрямую. Даже с некоторыми перестановками, такими как только удержание ссылки на вектор в самом итераторе или создание итератора в качестве ссылки или чего-то еще, чтобы получить время жизни, запеченное в типе ранее, я не могу ничего пройти за счет проверки заимствования.
Я прочиталИтераторы, дающие изменяемые ссылки"blogpost, но я не уверен, если / как это относится к моей проблеме, которая не включает изменяемые ссылки.