有没有办法实现具有不同签名的特征方法?

Is there a way to implement a trait method with a different signature?

我正在用 Rust 创建简单的矩阵实现。我需要遍历矩阵,获取坐标以及值:

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

据我所知,Iterator::enumerate 是预定义的,我无法使用能够 return (usize, usize, &T) 的自定义实现来覆盖它。有没有办法实现自定义 enumerate() 方法?

我认为处理您的问题的最佳方法是创建一个新特征,该特征定义一个函数,例如 enumerate2D(),它具有您想要的那种签名。

不能更改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);
    }
}

在这里,我跳过了矩阵的复杂性,只是沿着对角线前进。您的实际实现必须处理行优先或列优先迭代,并在 row/column.

的末尾正确包装