2015-04-06 2 views
2

Я создаю простую матричную реализацию в Rust. Мне нужно перебирать матрицу, получая координаты в дополнение к значению:Есть ли способ реализовать метод признака с другой подписью?

for (i, j, elem) in matrix.iter().enumerate() { 
    ... 
} 

Насколько я могу видеть, Iterator::enumerate предопределен, и я не могу изменить его с помощью пользовательской реализации, который способен вернуть (usize, usize, &T). Есть ли способ реализовать пользовательский метод enumerate()?

ответ

5

Правильно, что вы не можете изменить подпись 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); 
    } 
} 

Здесь я пропущу сложность матрицы и только вперед вниз по диагонали. Ваша реальная реализация должна иметь дело с крупной или большой итерационной итерацией и правильной упаковкой в ​​конце строки/столбца.

+0

Спасибо за подробный ответ. Итак, я думаю, что я должен интерпретировать «перечислить» как способ получить «i» из «foreach» и не более того. Жаль. – Lodin

1

Я думаю, что лучший способ справиться с вашей проблемой - создать новый признак, который определяет функцию, такую ​​как enumerate2D(), которая имеет тип подписи, которую вы хотите.

Смежные вопросы