基于以下示例,可以在Rust中使用链式方法调用编写构建模式,该方法调用通过值或通过引用传递(使用生命周期说明符)
是否可以创建一个宏来实现构建器模式方法?
如何重载"新"方法?(回答)
https://github.com/rust-unofficial/patterns/blob/master/patterns/builder.md
Rust中的构建器模式可能如下所示:
ui::Button::new() .label("Test") .align(Align::Center) .build();
在写作惯用的Rust时,有一种强烈的偏好吗?
有没有一个很好的例子,如何在Rust中写这个?
实际上有两个权衡:
命名的setter应该self
通过值还是引用接受?
最终build
方法应该接受self
价值还是参考?
我的建议是:
对于二传手的可变参考
build
方法的价值
这与Rust Book中使用引用的Builder模式稍有不同build
.
为什么通过可变引用传递给setter?
虽然编译器可以优化由调用引起的移动fn label(self, &str) -> ButtonBuilder
,但是不能保证.
另一方面,可变参考方式已经是最优的,因此您无需依赖优化器.
为什么要通过最后的价值build
?
对于仅由Copy
字段组成的构建者,build
服用self
或之间没有区别&self
.
但是,只要构建器包含非Copy
字段,传递&self
到build
需要深度克隆这些字段.
另一方面,传递self
值允许build
移动字段,从而避免不必要的副本.
如果希望重新使用构建器,那么构建器应该实现Clone
.