小编给大家分享一下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模式”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。