如何用Rust中的链式方法调用编写一个惯用的构建模式?

ide*_*n42 0 convention builder-pattern rust

基于以下示例,可以在Rust中使用链式方法调用编写构建模式,该方法调用通过值或通过引用传递(使用生命周期说明符)

Rust中的构建器模式可能如下所示:

 ui::Button::new()
    .label("Test")
    .align(Align::Center)
    .build();
Run Code Online (Sandbox Code Playgroud)

在写作惯用的Rust时,有一种强烈的偏好吗?

有没有一个很好的例子,如何在Rust中写这个?

Mat*_* M. 5

实际上有两个权衡:

  • 命名的setter应该self通过值还是引用接受?
  • 最终build方法应该接受self价值还是参考?

我的建议是:

  • 对于二传手的可变参考
  • build方法的价值

这与Rust Book中使用引用的Builder模式稍有不同build.


为什么通过可变引用传递给setter?

虽然编译器可以优化由调用引起的移动fn label(self, &str) -> ButtonBuilder,但是不能保证.

另一方面,可变参考方式已经是最优的,因此您无需依赖优化器.


为什么要通过最后的价值build

对于仅由Copy字段组成的构建者,build服用self或之间没有区别&self.

但是,只要构建器包含非Copy字段,传递&selfbuild需要深度克隆这些字段.

另一方面,传递self值允许build移动字段,从而避免不必要的副本.

如果希望重新使用构建器,那么构建器应该实现Clone.