Конфликт времен жизни

Не думаю что тут дело в индексах.
Пока не реализуют 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.

1 лайк