我有以下代码:
#[derive(Clone, Copy)]
struct Point {
x: f64,
y: f64,
z: f64
}
impl Point {
fn set_z(&self, val: f64) -> Point {
Point{x: self.x, y: self.y, z: val}
}
}
struct Boo {
point: Point
}
impl Boo {
fn point(&self) -> &Point { &self.point }
fn set_point(&mut self, val: &Point) { self.point = *val; }
}
fn main() {
let mut boo = Boo{point:Point{x: 0., y: 0., z: 0.}};
let new_p = boo.point().set_z(17.);
boo.set_point(&new_p);
}
事实上,我有很多结构,例如Boo
和Point
字段,而且我经常需要更改其中的一个字段。
所以我可以
实施数百万种方法,如:
impl Boo {
fn set_x(&mut self, val: f64) { self.point.x = val; }
fn set_y(&mut self, val: f64) { self.point.y = val; }
//...
}
哪个太无聊了,如果有两个,三个字段,如point1
,point2
等等,我将被埋没在这些方法中。
问题顶部描述的方法看起来更好,因为每个字段只需要两个方法,但我必须分两步进行修改:获取点和设定点。
所以对我来说理想的方法看起来像这样:
boo.set_point(boo.point().set_z(17.));
但这是不可能的,因为要实现这一点,我需要以某种方式同时读取和写入引用。
如何为模块用户简化Point
的一个字段设置?