it编程 > 编程语言 > rust

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

191人参与 2024-08-15 rust

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

这里参考资料2的文章,修改部分代码后如下。这段代码的目的是使用构建器模式创建和初始化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构建器模式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Rust 数据分析利器polars用法详解

08-20

如何基于Rust实现文本搜索minigrep

08-09

MySQL中的log_bin_trust_function_creators系统变量

09-02

【Rust光年纪】提升数据安全性与完整性:Rust语言哈希算法库深度对比

08-06

如何使用Rust直接编译单个的Solidity合约

09-20

详解Rust调用tree-sitter支持自定义语言解析

09-26

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论