小编给大家分享一下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, } }}AI代码助手复制代码
在设置属性方法的时候,通常的实现是通过消耗原本的构造器后生成新构造器,这使得如果配置构造器的过程不能连续调用属性设置方法时,必须重新捕获构造器:
let mut builder = CounterBuilder::default();// ... 进行一些计算,获得需要配置的值let cnt1 = operations();builder = builder.set_counted1(cnt);// ... 进行一些计算,获得需要配置的值let cnt2 = operations();builder = builder.set_counted(cnt2);AI代码助手复制代码
以上代码通常出现在需要流计算并及时记录参数配置的时候。并且,如果构造器被更大型的数据结构持有时,消耗并重新构建构造器可能会对性能有点影响。因此在博主个人实现时通常采取传递&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 }// ...AI代码助手复制代码
改成如上形式的函数签名,即可 灵活构造 目标结构:
let mut builder = CounterBuilder::default();// ... 进行一些计算,获得需要配置的值let cnt1 = operations();builder.set_counted1(cnt);// ... 进行一些计算,获得需要配置的值let cnt2 = operations();builder.set_counted(cnt2);// ... 可能还要等待别的操作完成后再进行构建let counter = builder.build();AI代码助手复制代码
build(self)
方法,也可以使用非消耗性的
fn build(&self)
方法,使得构造器可以多次复用。构造器模式由于有以下缺点而在部分场景中不适用:
以上是“Rust中如何实现Builder模式”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4581704/blog/4375425