根据下面的例子,可以用链式方法调用一个生成模式,它通过值或引用(以生命说明符)传递。
生锈的建筑图案可能看起来像这样:
ui::Button::new() .label("Test") .align(Align::Center) .build();
当写习惯性的铁锈时,有没有强烈的偏好?
有什么好的例子可以用铁锈写出来吗?
我已经看到构建器模式主要是通过在修改时获得构建器的所有权来实现的,并且通过引用 build() 是的。例如,
build()
#[derive(Debug, Eq, PartialEq)] struct Foo { value: usize, } struct FooBuilder { foos: usize, bars: usize, } impl FooBuilder { fn new() -> FooBuilder { FooBuilder { foos: 0, bars: 0, } } fn set_foos(mut self, foos: usize) -> FooBuilder { self.foos = foos; self } fn set_bars(mut self, bars: usize) -> FooBuilder { self.bars = bars; self } fn build(&self) -> Foo { Foo { value: self.foos + self.bars, } } } fn main() { let foo = FooBuilder::new() .set_foos(2) .set_bars(3) .build(); assert_eq!(foo, Foo { value: 5 }); }
Try on Rust Playground
这使得链接简单,同时允许重用生成器。
实际上 二 权衡:
self
build
自己
我的建议是:
建造
这与 Builder Pattern 出现在铁锈书中,该书引用了 建造 是的。
为什么要为setter传递可变引用?
当编译器 可以 优化取消调用 fn label(self, &str) -> ButtonBuilder ,不保证。
fn label(self, &str) -> ButtonBuilder
另一方面,可变引用方式已经是最优的,因此您不需要依赖优化器。
为什么通过价值为最终 建造 是吗?
建筑商只有 Copy 字段之间没有区别 建造 拿 自己 或 &self 是的。
Copy
&self
但是,只要构建器包含- 复制 场,传球 &自己 到 建造 需要深入克隆这些字段。
复制
&自己
另一方面,传球 自己 按值允许 建造 移动字段,以避免不必要的复制。
如果希望重用构建器,那么构建器应该实现 Clone 是的。
Clone