Вы можете сделать это с помощью трейта. Поскольку Point
равно Copy
, также нет необходимости использовать ссылки:
#[derive(Copy, Clone)]
struct Point {
pub x: i32,
pub y: i32,
}
impl Point {
fn new(x: i32, y: i32) -> Point {
Point { x, y }
}
}
trait AddToPoint<T> {
fn add(&mut self, value: T);
}
impl AddToPoint<i32> for Point {
fn add(&mut self, value: i32) {
self.x += value;
self.y += value;
}
}
impl AddToPoint<Point> for Point {
fn add(&mut self, value: Point) {
self.x += value.x;
self.y += value.y;
}
}
fn main() {
println!("Hello world!");
let mut point = Point::new(1,1);
point.add(1);
point.add(point);
}
Другая возможность - использовать перегрузку оператора, реализовав трейт std::ops::AddAssign
. Затем вы можете использовать оператор +=
для добавления значений к точкам:
use std::ops::AddAssign;
#[derive(Copy, Clone)]
struct Point {
pub x: i32,
pub y: i32,
}
impl Point {
fn new(x: i32, y: i32) -> Point {
Point { x, y }
}
}
impl AddAssign<i32> for Point {
fn add_assign(&mut self, value: i32) {
self.x += value;
self.y += value;
}
}
impl AddAssign<Point> for Point {
fn add_assign(&mut self, value: Point) {
self.x += value.x;
self.y += value.y;
}
}
fn main() {
println!("Hello world!");
let mut point = Point::new(1,1);
point += 1;
point += point;
}