重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
小编给大家分享一下Rust中如何实现Builder模式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
定制开发可以根据自己的需求进行定制,成都网站设计、网站建设、外贸网站建设构思过程中功能建设理应排到主要部位公司成都网站设计、网站建设、外贸网站建设的运用实际效果公司网站制作网站建立与制做的实际意义
通常在 Rust 中的实现是通过 不断重建 Builder
来构造最后的类型:
struct Counter {
counted1: usize,
counted2: usize,
done: bool,
}
struct CounterBuilder {
counted1: usize,
counted2: usize,
}
impl CounterBuilder {
// 构建器需要有默认的参数配置,然后从默认配置触发进行构建。
// 不适用 #[derive(std::default::Default)],因为默认配置可能不一样
fn default() -> Self {
CounterBuiler {
counted1: 5,
counted2: 0,
}
}
// 属性定制方法。消耗原本的构建器,修改属性后重新生成新构建器
fn set_counted1(self, cnt: usize) -> Self {
self.counted1 = cnt;
self
}
fn set_counted2(self, cnt: usize) -> Self {
self.counted2 = cnt;
self
}
// 最后通过 `build` 方法生成所需类型
fn build(self) -> Counter {
Counter {
counted1: self.counted1,
counted2: self.counted2,
done: false,
}
}
}
在设置属性方法的时候,通常的实现是通过消耗原本的构造器后生成新构造器,这使得如果配置构造器的过程不能连续调用属性设置方法时,必须重新捕获构造器:
let mut builder = CounterBuilder::default();
// ... 进行一些计算,获得需要配置的值
let cnt1 = operations();
builder = builder.set_counted1(cnt);
// ... 进行一些计算,获得需要配置的值
let cnt2 = operations();
builder = builder.set_counted(cnt2);
以上代码通常出现在需要流计算并及时记录参数配置的时候。并且,如果构造器被更大型的数据结构持有时,消耗并重新构建构造器可能会对性能有点影响。因此在博主个人实现时通常采取传递&mut self
引用的方法来实现属性设置方法:
// ...
// 属性定制方法。消耗原本的构建器,修改属性后重新生成新构建器
fn set_counted1(&mut self, cnt: usize) -> &mut Self {
self.counted1 = cnt;
self
}
fn set_counted2(&mut self, cnt: usize) -> &mut Self {
self.counted2 = cnt;
self
}
// ...
改成如上形式的函数签名,即可 灵活构造 目标结构:
let mut builder = CounterBuilder::default();
// ... 进行一些计算,获得需要配置的值
let cnt1 = operations();
builder.set_counted1(cnt);
// ... 进行一些计算,获得需要配置的值
let cnt2 = operations();
builder.set_counted(cnt2);
// ... 可能还要等待别的操作完成后再进行构建
let counter = builder.build();
build(self)
方法,也可以使用非消耗性的
fn build(&self)
方法,使得构造器可以多次复用。构造器模式由于有以下缺点而在部分场景中不适用:
以上是“Rust中如何实现Builder模式”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!