Rust實(shí)現(xiàn)構(gòu)建器模式和如何使用Bon庫(kù)中的構(gòu)建器
實(shí)現(xiàn)構(gòu)建器模式的一種方式
這里參考資料2的文章,修改部分代碼后如下。這段代碼的目的是使用構(gòu)建器模式創(chuàng)建和初始化Person對(duì)象。以下是各部分的解釋:
結(jié)構(gòu)體定義
- Person: 定義了一個(gè)結(jié)構(gòu)體,包含name、age、address和sex四個(gè)字段。address和sex是可選的
- PersonBuilder: 用于逐步構(gòu)建Person對(duì)象的構(gòu)建器結(jié)構(gòu)體
構(gòu)建器實(shí)現(xiàn)
- new: 創(chuàng)建一個(gè)新的PersonBuilder實(shí)例,初始化name和age,其他字段為None
- with_address: 設(shè)置address字段,返回修改后的構(gòu)建器
- with_sex: 設(shè)置sex字段,返回修改后的構(gòu)建器
- build: 生成最終的Person對(duì)象
主函數(shù)
- 使用PersonBuilder構(gòu)建一個(gè)Person對(duì)象,設(shè)置name、age、address和sex
- 打印Person對(duì)象及其各個(gè)字段的值
目的
- 封裝對(duì)象創(chuàng)建過程: 使用構(gòu)建器模式來管理對(duì)象初始化的復(fù)雜性
- 可選字段設(shè)置: 允許靈活地設(shè)置可選字段,而不必在創(chuàng)建對(duì)象時(shí)提供所有信息
- 鏈?zhǔn)秸{(diào)用: 提供鏈?zhǔn)秸{(diào)用的接口,使代碼更簡(jiǎn)潔易讀
#[derive(Debug)] struct Person { name: String, age: u32, address: Option<String>, sex: Option<String>, } struct PersonBuilder { name: String, age: u32, address: Option<String>, sex: Option<String>, } impl PersonBuilder { fn new(name: String, age: u32) -> Self { Self { name, age, address: None, sex: None, } } fn with_address(mut self, address: String) -> Self { self.address = Some(address); self } fn with_sex(mut self, sex: String) -> Self { self.sex = Some(sex); self } fn build(self) -> Person { Person { name: self.name, age: self.age, address: self.address, sex: self.sex, } } } fn main() { let person = PersonBuilder::new("Alice".to_string(), 30) .with_address("Wonderland".to_string()) .with_sex("Female".to_string()) .build(); println!("{:?}", person); // Access the fields to demonstrate usage println!("Name: {}", person.name); println!("Age: {}", person.age); if let Some(address) = &person.address { println!("Address: {}", address); } else { println!("Address: None"); } if let Some(sex) = &person.sex { println!("Sex: {}", sex); } else { println!("Sex: None"); } }
Person { name: "Alice", age: 30, address: Some("Wonderland"), sex: Some("Female") } Name: Alice Age: 30 Address: Wonderland Sex: Female
使用Bon構(gòu)建器
了解完Rust如何實(shí)現(xiàn)構(gòu)建器模式后,如果我們想要在實(shí)際項(xiàng)目中使用構(gòu)建器,當(dāng)然可以不用自己手動(dòng)實(shí)現(xiàn),可以使用第三方庫(kù)Bon,引入方式如下
Cargo.toml
[dependencies] bon = "1.1.0"
use bon::bon; #[derive(Debug)] struct Person { name: String, age: u32, address: Option<String>, sex: Option<String>, } #[bon] // 使用 Bon 庫(kù)的宏 impl Person { #[builder] fn new(name: String, age: u32) -> Self { Self { name, age, address: None, sex: None, } } #[builder] fn with_address(&mut self, address: String) { self.address = Some(address); } #[builder] fn with_sex(&mut self, sex: String) { self.sex = Some(sex); } } fn main() { let mut person = Person::builder() .name("Alice".to_string()) .age(30) .build(); person.with_address().address("Wonderland").call(); person.with_sex().sex("Female").call(); println!("{:?}", person); println!("Name: {}", person.name); println!("Age: {}", person.age); if let Some(address) = &person.address { println!("Address: {}", address); } else { println!("Address: None"); } if let Some(sex) = &person.sex { println!("Sex: {}", sex); } else { println!("Sex: None"); } }
Person { name: "Alice", age: 30, address: Some("Wonderland"), sex: Some("Female") } Name: Alice Age: 30 Address: Wonderland Sex: Female
運(yùn)行結(jié)果和手動(dòng)實(shí)現(xiàn)方式一致。當(dāng)然這種方式更為簡(jiǎn)潔,可以省略很多代碼實(shí)現(xiàn),容易維護(hù)和閱讀,更推薦使用
參考資料3,Bon除了結(jié)構(gòu)體的構(gòu)建器和關(guān)聯(lián)方法的構(gòu)建器,還有函數(shù)的構(gòu)建器
fn main() { #[bon::builder] fn greet(name: &str, age: u32) -> String { format!("Hello {name} with age {age}!") } let greeting = greet() .name("Bon") .age(24) .call(); if greeting == "Hello Bon with age 24!" { println!("Assertion passed: {}", greeting); } else { println!("Assertion failed"); } }
Assertion passed: Hello Bon with age 24!
參考資料
How to do named function arguments in Rust
Overview | Bon (elastio.github.io)
到此這篇關(guān)于Rust實(shí)現(xiàn)構(gòu)建器模式和使用Bon庫(kù)中的構(gòu)建器的文章就介紹到這了,更多相關(guān)Rust構(gòu)建器模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用rust?寫一個(gè)jar包?class沖突檢測(cè)工具
這篇文章主要介紹了用rust?寫一個(gè)jar包?class沖突檢測(cè)工具?的相關(guān)資料,需要的朋友可以參考下2023-05-05教你使用RustDesk?搭建一個(gè)自己的遠(yuǎn)程桌面中繼服務(wù)器
這篇文章主要介紹了RustDesk?搭建一個(gè)自己的遠(yuǎn)程桌面中繼服務(wù)器,主要包括服務(wù)端安裝和客戶端配置方法,配置好相關(guān)操作輸入控制碼即可發(fā)起遠(yuǎn)程或文件傳輸,本文通過圖文給大家講解的非常詳細(xì),需要的朋友可以參考下2022-08-08Rust?use關(guān)鍵字妙用及模塊內(nèi)容拆分方法
這篇文章主要介紹了Rust?use關(guān)鍵字妙用|模塊內(nèi)容拆分,文中還給大家介紹use關(guān)鍵字的習(xí)慣用法,快速引用自定義模塊內(nèi)容或標(biāo)準(zhǔn)庫(kù),以此優(yōu)化代碼書寫,需要的朋友可以參考下2022-09-09Rust?搭建一個(gè)小程序運(yùn)行環(huán)境的方法詳解
rust是一門比較新的編程語言,2015年5月15日,Rust編程語言核心團(tuán)隊(duì)正式宣布發(fā)布Rust?1.0版本,本文給大家介紹Rust?搭建一個(gè)小程序運(yùn)行環(huán)境,以iOS?為例介紹開發(fā)環(huán)境的準(zhǔn)備,感興趣的朋友跟隨小編一起看看吧2022-05-05Rust初體驗(yàn):手把手教你構(gòu)建‘Hello,?World!’
"準(zhǔn)備好了嗎?一起踏上Rust編程語言的精彩旅程!在這篇「Rust初體驗(yàn)」中,我們將手把手教你構(gòu)建經(jīng)典程序“Hello,?World!”,感受Rust的強(qiáng)大與安全,短短幾行代碼,就能讓你對(duì)這個(gè)系統(tǒng)級(jí)語言的魅力一探究竟!快加入吧,驚喜等你發(fā)現(xiàn)!"2024-01-01