有没有一种方法来实现具有不同签名的特征方法?

问题描述:

我正在Rust中创建简单的矩阵实现。我需要遍历矩阵,得到了坐标,除了值:有没有一种方法来实现具有不同签名的特征方法?

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

据我所看到的,Iterator::enumerate是预先定义的,我不能与一个自定义实现,它能够返回重写它(usize, usize, &T)。有没有办法实现自定义enumerate()方法?

无法更改Iterator::enumerate的签名是正确的;这样做不会像任何其他消费者期望的那样实现该特性。但是,您可以直接Matrix,你想要做什么创建enumerate方法:

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

感谢您的详细解答。所以,我认为我应该解释'enumerate'只是为了从'foreach'中获得'i',而不再是其他任何东西。很遗憾。 – Lodin

我认为处理您的问题的最佳方法是创建一个新的特征,它定义了一个像enumerate2D()这样的函数,它具有您想要的特征类型。