Operadores
La sobrecarga de operadores se implementa mediante traits en std::ops:
#[derive(Debug, Copy, Clone)]
struct Point {
x: i32,
y: i32,
}
impl std::ops::Add for Point {
type Output = Self;
fn add(self, other: Self) -> Self {
Self { x: self.x + other.x, y: self.y + other.y }
}
}
fn main() {
let p1 = Point { x: 10, y: 20 };
let p2 = Point { x: 100, y: 200 };
println!("{:?} + {:?} = {:?}", p1, p2, p1 + p2);
}
This slide should take about 5 minutes.
Cuestiones de debate:
- ¿En qué situaciones sería útil implementar
Addpara&Point?- Respuesta:
Add:addconsume aself. Si el tipoTpara el que se sobrecarga el operador no esCopy, deberías plantearte también sobrecargar el operador para&T. Así se evita la clonación innecesaria en el sitio de la llamada.
- Respuesta:
- ¿Por qué
Outputes un tipo asociado? ¿Se podría convertir en un parámetro tipo del método?- Respuesta corta: el llamador controla los parámetros tipo de la función, pero los tipos asociados (como
Output) son controlados por el implementador de un trait.
- Respuesta corta: el llamador controla los parámetros tipo de la función, pero los tipos asociados (como
- Se podría implementar
Addpara dos tipos distintos; por ejemplo,impl Add<(i32, i32)> for Pointañadiría una tupla a unPoint.