有没有办法实现具有不同签名的特征方法?
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.
的末尾正确包装
我正在用 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.
的末尾正确包装