Проблема здесь в аннотациях времени жизни. Вы используете одно и то же время жизни 'd
, поэтому изменяемый заем в c.iter_rows_mut
должен длиться все время жизни c
.
. Чтобы исправить это, используйте другое время жизни в iter_rows
и iter_rows_mut
. Это будет неявно связано не более чем 'd
, но это даст большую гибкость.
Полностью явные подписи должны быть
fn iter_rows<'a>(&'a self, vertical_range: Range<usize>) -> impl Iterator<Item=(usize, &'a [T])> + 'a
и
fn iter_rows_mut<'a>(&'a mut self, vertical_range: Range<usize>) -> impl Iterator<Item=(usize, &'a mut [T])> + 'a {
Благодаря жизненному выбору нам не нужно никаких из этих жизней. Все времена жизни в типе вывода будут неявно такими же, как и у &self
(или &mut self
).
fn iter_rows(&self, vertical_range: Range<usize>) -> impl Iterator<Item=(usize, &[T])>
fn iter_rows_mut(&mut self, vertical_range: Range<usize>) -> impl Iterator<Item=(usize, &mut [T])>
(детская площадка)
PS Вызовы into_iter
в каждой из этих функций не нужны: chunks_exact
уже создает итератор. Клиппи предупреждает об этом.