首页 > 其他分享 >Rust实现构建器模式和使用Bon库中的构建器

Rust实现构建器模式和使用Bon库中的构建器

时间:2024-08-09 17:16:24浏览次数:9  
标签:库中 age sex 构建 Bon address println self name

实现构建器模式的一种方式

这里参考资料2的文章,修改部分代码后如下。这段代码的目的是使用构建器模式创建和初始化Person对象。以下是各部分的解释:

  • 结构体定义

    • Person: 定义了一个结构体,包含name、age、address和sex四个字段。address和sex是可选的
    • PersonBuilder: 用于逐步构建Person对象的构建器结构体
  • 构建器实现

    • new: 创建一个新的PersonBuilder实例,初始化name和age,其他字段为None
    • with_address: 设置address字段,返回修改后的构建器
    • with_sex: 设置sex字段,返回修改后的构建器
    • build: 生成最终的Person对象
  • 主函数

    • 使用PersonBuilder构建一个Person对象,设置name、age、address和sex
    • 打印Person对象及其各个字段的值
  • 目的

    • 封装对象创建过程: 使用构建器模式来管理对象初始化的复杂性
    • 可选字段设置: 允许灵活地设置可选字段,而不必在创建对象时提供所有信息
    • 链式调用: 提供链式调用的接口,使代码更简洁易读
#[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构建器

了解完Rust如何实现构建器模式后,如果我们想要在实际项目中使用构建器,当然可以不用自己手动实现,可以使用第三方库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 库的宏
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

运行结果和手动实现方式一致。当然这种方式更为简洁,可以省略很多代码实现,容易维护和阅读,更推荐使用

参考资料3,Bon除了结构体的构建器和关联方法的构建器,还有函数的构建器

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!

参考

  1. How to do named function arguments in Rust
  2. Rust 中的建造者模式 (qq.com)
  3. Overview | Bon (elastio.github.io)

标签:库中,age,sex,构建,Bon,address,println,self,name
From: https://www.cnblogs.com/vinciyan/p/18351094

相关文章

  • YOLOv8改进 | 主干网络 | 用EfficientNet卷积替换backbone【教程+代码 】
     秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转......
  • 构建智能生态,安防监控EasyCVR视频汇聚流媒体技术在智能分析领域的应用
    随着5G、AI、物联网(IoT)、云计算等技术的快速发展,万物互联的时代已经到来,全新的行业生态AIoT正在引领一场深刻的变革。在这场变革中,EasyCVR视频流媒体技术以其强大的视频处理、汇聚与融合能力,在智能分析领域展现出了巨大的应用潜力和价值。一、EasyCVR视频流媒体技术概述EasyCVR......
  • docker 构建tomcat
     dockersearchtomcat dockerpulltomcat 创建挂载目录:运行dockerdockerrun --nametomcat_mysql_cs--restartalways-p8081:8080-v/app/tomcat/tomcat_mysql_cs/webapps:/usr/local/tomcat/webapps-v/app/tomcat/tomcat_mysql_cs/logs:/usr/local/tomcat/l......
  • 浅谈前端研发链路之构建
    前言我们每天都在说构建构建,你真的了解前端构建吗?文末有我在前端面试多年的经验文章!!!在现代前端开发中,构建过程扮演着至关重要的角色。随着Web应用变得越来越复杂,直接编写原生HTML、CSS和JavaScript已经不能满足开发需求,我们需要工程化的体系去构建前端应用。构建过......
  • nlp基础之-词汇表构建的具体做法
    词汇表构建(VocabularyBuilding)是文本数据预处理中的关键步骤,涉及从训练语料中生成一个包含所有可识别单词、子词或字符的集合。具体做法如下:1.数据收集与清洗数据收集:收集所有待处理的文本数据,包括训练集、验证集和测试集。数据清洗:在构建词汇表之前,清洗数据以去除噪声......
  • docker 构建redis
    一、Docker搜索redis镜像dockersearchredis 二、Docker拉取镜像dockerpullredis 三、Docker挂载配置文件接下来就是要将redis的配置文件进行挂载,以配置文件方式启动redis容器。(挂载:即将宿主的文件和容器内部目录相关联,相互绑定,在宿主机内修改文件的话也随之修改容......
  • 构建即时通讯应用:Spring boot高效集成WebSocket、Stomp协议完成前后端持续通信
    1.引入依赖在你的SpringBoot项目的pom.xml中添加以下依赖:<dependencies><!--SpringBootStarterThymeleaf--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-st......
  • AI赋能周界安防:智能视频分析技术构建无懈可击的安全防线
    周界安全防范是保护机场、电站、油库、监狱、工业园区等关键设施免受非法入侵和破坏的重要措施。传统的周界安防手段主要依靠人员巡查和物理屏障,但这种方式不仅人力成本高,而且效率较低,难以满足日益复杂多变的安全需求。随着AI技术的引入,特别是视频智能分析技术的成熟,周界安全防范......
  • 012、Ubuntu22.04配置bond
    1、修改网络配置文件vim/etc/netplan/00-installer-config.yaml2、配置文件内容如下:#Thisisthenetworkconfigwrittenby'subiquity'network:bonds:bond0:addresses:-10.14.21.2/24interfaces:-enp97s0f0np0-enp97s0f1......
  • docker 构建nginx
     1、查看可用的Nginx版本 dockersearchnginx 2、取最新版的Nginx镜像这里我们拉取官方的最新版本的镜像:$dockerpullnginx:latest3、查看本地镜像使用以下命令来查看是否已安装了nginx:$dockerimages 4、运行容器安装完成后,我们可以使用以下命令来运......