您好,登錄后才能下訂單哦!
小編給大家分享一下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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。