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

 更新时间:2024年08月15日 12:19:50   作者:VinciYan  
这篇文章主要介绍了Rust实现构建器模式和如何使用Bon库中的构建器,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

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

这里参考资料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!

参考资料

How to do named function arguments in Rust

Rust 中的建造者模式 (qq.com)

Overview | Bon (elastio.github.io)

到此这篇关于Rust实现构建器模式和使用Bon库中的构建器的文章就介绍到这了,更多相关Rust构建器模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅析Rust多线程中如何安全的使用变量

    浅析Rust多线程中如何安全的使用变量

    这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下
    2025-01-01
  • 用rust 写一个jar包 class冲突检测工具

    用rust 写一个jar包 class冲突检测工具

    这篇文章主要介绍了用rust 写一个jar包 class冲突检测工具 的相关资料,需要的朋友可以参考下
    2023-05-05
  • Rust 枚举和模式匹配的实现

    Rust 枚举和模式匹配的实现

    枚举是 Rust 中非常重要的复合类型,也是最强大的复合类型之一,广泛用于属性配置、错误处理、分支流程、类型聚合等场景中,本文就来介绍一下Rust 枚举和模式匹配,感兴趣的可以了解一下
    2023-12-12
  • 教你使用RustDesk 搭建一个自己的远程桌面中继服务器

    教你使用RustDesk 搭建一个自己的远程桌面中继服务器

    这篇文章主要介绍了RustDesk 搭建一个自己的远程桌面中继服务器,主要包括服务端安装和客户端配置方法,配置好相关操作输入控制码即可发起远程或文件传输,本文通过图文给大家讲解的非常详细,需要的朋友可以参考下
    2022-08-08
  • Rust use关键字妙用及模块内容拆分方法

    Rust use关键字妙用及模块内容拆分方法

    这篇文章主要介绍了Rust use关键字妙用|模块内容拆分,文中还给大家介绍use关键字的习惯用法,快速引用自定义模块内容或标准库,以此优化代码书写,需要的朋友可以参考下
    2022-09-09
  • 深入讲解下Rust模块使用方式

    深入讲解下Rust模块使用方式

    很多时候,我们写的代码需要按模块组织,因为我们无法将大量的代码都写在一个文件上,那样不容易维护,下面这篇文章主要给大家介绍了关于Rust模块使用方式的相关资料,需要的朋友可以参考下
    2022-03-03
  • Rust 搭建一个小程序运行环境的方法详解

    Rust 搭建一个小程序运行环境的方法详解

    rust是一门比较新的编程语言,2015年5月15日,Rust编程语言核心团队正式宣布发布Rust 1.0版本,本文给大家介绍Rust 搭建一个小程序运行环境,以iOS 为例介绍开发环境的准备,感兴趣的朋友跟随小编一起看看吧
    2022-05-05
  • Rust初体验:手把手教你构建‘Hello, World!’

    Rust初体验:手把手教你构建‘Hello, World!’

    "准备好了吗?一起踏上Rust编程语言的精彩旅程!在这篇「Rust初体验」中,我们将手把手教你构建经典程序“Hello, World!”,感受Rust的强大与安全,短短几行代码,就能让你对这个系统级语言的魅力一探究竟!快加入吧,惊喜等你发现!"
    2024-01-01
  • Rust处理命令行参数

    Rust处理命令行参数

    在Rust中,命令行参数是程序从命令行接收的输入,它们为程序提供了运行时配置和数据的灵活性,本文就来介绍一下Rust处理命令行参数,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 使用Rust实现日志记录功能

    使用Rust实现日志记录功能

    这篇文章主要为大家详细介绍了使用Rust实现日志记录功能的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的可以参考一下
    2024-04-04

最新评论