中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Rust中如何實現Builder模式

發布時間:2021-12-28 11:47:50 來源:億速云 閱讀:141 作者:小新 欄目:大數據

小編給大家分享一下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();
             
   

為什么使用構造器模式

  • 構造過程可控。通常實現構造器模式的時候,我們會將構造器所需要配置的屬性設置為私有[^1],并且只能通過我們提供的屬性設置方法進行設置,使得構造過程可控。另外,可以通過屬性設置方法提前恐慌(panic)來阻止生成無效對象。
  • 設置方法職責專一。屬性設置方法 [職責專一],只會負責設置一種屬性,只有在該屬性的設置規則改變時,相應的屬性設置方法才需要進行修改;
  • 構造靈活。多個屬性設置方法可以自由的組合在一起,也可以分步組合構造。
  • 可批量構造。我們除了使用消耗性的     build(self) 方法,也可以使用非消耗性的     fn build(&self) 方法,使得構造器可以多次復用。
  • 符合開閉原則。當某一屬性的設置方法內部實現發生變化的時候,不影響其他屬性的設置方式;而新增屬性及其設置方法時,可以通過鏈式調用很方便地增加新屬性的設置。
 

為什么不使用構造器模式

構造器模式由于有以下缺點而在部分場景中不適用:

  • 在構造完成前無法使用被構造對象。在構造完成之前,構造器并不生成被構造對象,因此在整個構造設置完成之前,無法使用被構造對象。
  • 構造器與被構造對象使用相同的屬性設置方法,造成代碼重復并無法復用。考慮需要只通過屬性設置方法來修改對象的場景,當被構造對象在使用過程中需要頻繁設置屬性,那么就需要編寫對應的屬性設置方法;而如果還使用構造器進行對象構造,那么屬性設置方法就會重復,并且可能造成構造器與被構造對象的屬性設置行為不一致的問題[^2]。


以上是“Rust中如何實現Builder模式”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吴江市| 博兴县| 元阳县| 东源县| 平乐县| 屏东市| 上饶县| 汉中市| 灵璧县| 济源市| 盘山县| 北辰区| 化州市| 娄底市| 河津市| 灵武市| 金阳县| 濉溪县| 禄劝| 永城市| 七台河市| 广东省| 万全县| 紫金县| 双江| 苏尼特右旗| 普安县| 卢龙县| 黄冈市| 定安县| 石嘴山市| 娱乐| 扎兰屯市| 临西县| 北票市| 涿鹿县| 高尔夫| 同仁县| 衡阳县| 蕲春县| 建宁县|