有没有一种方法来实现具有不同签名的特征方法?
问题描述:
我正在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);
}
}
在这里,我跳过矩阵的复杂性和公正的推进下斜。你真正的实现必须处理行主要或列主要迭代,并在行/列的末尾正确包装。
答
我认为处理您的问题的最佳方法是创建一个新的特征,它定义了一个像enumerate2D()这样的函数,它具有您想要的特征类型。
感谢您的详细解答。所以,我认为我应该解释'enumerate'只是为了从'foreach'中获得'i',而不再是其他任何东西。很遗憾。 – Lodin