gpt4 book ai didi

rust - 为什么 Rust 的方法文档使用单独的构建器结构作为示例?

转载 作者:行者123 更新时间:2023-11-29 07:57:38 25 4
gpt4 key购买 nike

我正在浏览 struct and method docs并且想知道为什么文档使用这个例子:

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);
}

我稍微修改过的代码更小,看起来做的事情完全一样:

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);
}

最佳答案

一般来说,CircleCircleBuilder 不是一回事,因此将它们视为不同的类型是有意义的。在您的示例中,一旦 Circle 已“完成”,实际上没有什么可以阻止某人调用构建器方法 (x, y, radius) - 没有任何强制执行。用户也可能不清楚哪些方法用于构建,哪些方法用于构建的对象。 Rust 有一个类型系统,可以用来静态地避免这样的错误——使用它是有意义的!

在其他情况下,最终确定步骤可能不那么微不足道 - 例如打开文件、执行其他 I/O 或计算其他一些私有(private)字段(在构建构建器时初始化这些字段没有意义)。

关于rust - 为什么 Rust 的方法文档使用单独的构建器结构作为示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39290852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com