91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

蕲春县| 克拉玛依市| 珲春市| 顺昌县| 辽源市| 巴彦县| 出国| 巴中市| 资源县| 弋阳县| 酒泉市| 古田县| 岑巩县| 民丰县| 克东县| 祁东县| 大名县| 永修县| 腾冲县| 西安市| 宜川县| 府谷县| 和政县| 布尔津县| 营口市| 华阴市| 凭祥市| 嘉黎县| 资中县| 兴安县| 建湖县| 湟中县| 无棣县| 民丰县| 东乡县| 保亭| 青田县| 浦东新区| 芒康县| 涟水县| 醴陵市|