Правильно, что вы не можете изменить подпись Iterator::enumerate
; это не будет реализовывать эту черту, как ожидал любой другой потребитель. Тем не менее, вы можете создать enumerate
метод непосредственно на Matrix
, который делает то, что вы хотите:
struct Matrix {
value: u8,
size: usize,
}
impl Matrix {
fn enumerate(&self) -> MatrixEnumerate {
MatrixEnumerate {
matrix: self,
pos: 0,
}
}
}
struct MatrixEnumerate<'a> {
matrix: &'a Matrix,
pos: usize,
}
impl<'a> Iterator for MatrixEnumerate<'a> {
type Item = (usize, usize, &'a u8);
fn next(&mut self) -> Option<(usize, usize, &'a u8)> {
if self.pos < self.matrix.size {
let v = Some((self.pos, self.pos, &self.matrix.value));
self.pos += 1;
v
} else {
None
}
}
}
fn main() {
let m = Matrix {
value: 42,
size: 10,
};
for (x, y, v) in m.enumerate() {
println!("{}, {}: {}", x, y, v);
}
}
Здесь я пропущу сложность матрицы и только вперед вниз по диагонали. Ваша реальная реализация должна иметь дело с крупной или большой итерационной итерацией и правильной упаковкой в конце строки/столбца.
Спасибо за подробный ответ. Итак, я думаю, что я должен интерпретировать «перечислить» как способ получить «i» из «foreach» и не более того. Жаль. – Lodin