Я пытаюсь реализовать Iterator::chain()
-подобную операцию для итератора GATified:
#![feature(generic_associated_types)]
pub trait LendingIterator {
type Item<'a> where Self: 'a;
fn next(&mut self) -> Option<Self::Item<'_>>;
}
Для этого, как и в случае с обычным Iterator::chain(), мне нужна структура Chain
, которая содержит два итератора в цепочке и реализацию LendingIterator
.
У меня проблема в том, что мне нужно указать типы итераторов A
и B
, имеющие соответствующие Item
общие связанные типы, поэтому я попробовал это:
pub struct Chain<A, B> {
a: Option<A>,
b: Option<B>,
}
impl<A, B> LendingIterator for Chain<A, B>
where
A: LendingIterator,
B: for<'a> LendingIterator<Item<'a>=A::Item<'a>>
{
type Item<'a> where Self: 'a = A::Item<'a>;
fn next(&mut self) -> Option<Self::Item<'_>> {
todo!()
}
}
Но я получаю:
error[E0311]: the parameter type `B` may not live long enough
--> src\lib.rs:63:12
|
63 | impl<A, B> LendingIterator for Chain<A, B> where A: LendingIterator, B: for<'a> LendingIterator<Item<'a>=A::Item<'a>> {
| - ^^^^^^^^^^^^^^^ ...so that the type `B` will meet its required lifetime bounds...
| |
| help: consider adding an explicit lifetime bound...: `B: 'a`
|
note: ...that is required by this bound
| ^^^^ ...so that the type `B` will meet its required lifetime bounds
Конечно, предложения компилятора не работают.
Как я могу добавить ограничение, что B
имеет достаточно долгое время жизни?
Срок службы 'b
не определен — вы имели в виду 'a
?
Оказывается, это ошибка в реализации GAT в Rust. Видеть это:
Придирка: вы можете сделать
fn next(&mut self) -> Option<Self::Item<'_>>;