我正在浏览结构和方法文档,并想知道为什么文档使用这个例子:
struct Circle {
x: f64,
y: f64,
radius: f64,
}
impl Circle {
fn area(&self) -> f64 {
std::f64::consts::PI * (self.radius * self.radius)
}
}
struct CircleBuilder {
x: f64,
y: f64,
radius: f64,
}
impl CircleBuilder {
fn new() -> CircleBuilder {
CircleBuilder { x: 0.0, y: 0.0, radius: 1.0, }
}
fn x(&mut self, coordinate: f64) -> &mut CircleBuilder {
self.x = coordinate;
self
}
fn y(&mut self, coordinate: f64) -> &mut CircleBuilder {
self.y = coordinate;
self
}
fn radius(&mut self, radius: f64) -> &mut CircleBuilder {
self.radius = radius;
self
}
fn finalize(&self) -> Circle {
Circle { x: self.x, y: self.y, radius: self.radius }
}
}
fn main() {
let c = CircleBuilder::new()
.x(1.0)
.y(2.0)
.radius(2.0)
.finalize();
println!("area: {}", c.area());
println!("x: {}", c.x);
println!("y: {}", c.y);
}
Run Code Online (Sandbox Code Playgroud)
我稍微修改过的代码较小,看起来完全一样:
struct Circle {
x: f64,
y: f64,
radius: f64,
}
impl Circle {
fn new() -> Circle {
Circle { x: 0.0, y: 0.0, radius: 1.0, }
}
fn x(&mut self, coordinate: f64) -> &mut Circle {
self.x = coordinate;
self
}
fn y(&mut self, coordinate: f64) -> &mut Circle {
self.y = coordinate;
self
}
fn radius(&mut self, radius: f64) -> &mut Circle {
self.radius = radius;
self
}
fn area(&self) -> f64 {
std::f64::consts::PI * (self.radius * self.radius)
}
fn finalize(&self) -> Circle {
Circle { x: self.x, y: self.y, radius: self.radius }
}
}
fn main() {
let c = Circle::new()
.x(1.0)
.y(2.0)
.radius(2.0)
.finalize();
println!("area: {}", c.area());
println!("x: {}", c.x);
println!("y: {}", c.y);
}
Run Code Online (Sandbox Code Playgroud)
一般来说,a Circle和a CircleBuilder不是一回事,因此将它们视为不同类型是有意义的.在你的榜样,一旦Circle已经"敲定",居然还有什么能阻止有人从调用生成器方法(x,y,radius) -没有什么强制执行它.用户还可能不清楚哪种方法用于构建,哪些方法用于构造的对象.Rust有一个类型系统,可以用来静态避免这样的错误 - 使用它是有道理的!
在其他情况下,最终化步骤可能不那么简单 - 例如打开文件,执行其他I/O或计算其他一些私有字段(在构建构建器时初始化是没有意义的).
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |