Не думаю что тут дело в индексах.
Пока не реализуют GATs такое сделать невозможно (и скорее всего GATs тоже не помогут см. ниже). Я раньше кидал ссылку на статью со способами решения этой проблемы ( Solving the Generalized Streaming Iterator Problem without GATs ), но на практике они все малополезны.
Через unsafe
тоже очень не советую это делать. Тут все завязано на особенности мутабельных ссылок - эксклюзивность и инвариантность относительно типа.
Если отбросить лишнее (типаж Iterator
) и явно указать вж, функцию next()
можно записать так:
fn next<'b, 'a, V>(self: &'b mut UnitIterMut<'a, Joint, V>) -> Option<(Joint, &'a mut V)> {
Some((Joint::J0, &mut self.unit.0[0]))
}
Если пойти еще дальше все можно свести к такой функции:
fn next<'b, 'a, V>(slf: &'b mut &'a mut V) -> &'a mut V {
&mut **slf
}
Такая функция в принципе не реализуема, кроме случая когда 'b:'a
(вж 'b
не меньше чем 'a
, в данном случе равно). Я об этом раньше писал в теме: Странное поведение вложенных мутабельных ссылок.
А типаж Iterator
без GATs не дает возможности описать связь между вж ассоциированного типа и Self
.