4 个版本
0.2.2 | 2023 年 3 月 30 日 |
---|---|
0.2.0 | 2023 年 3 月 30 日 |
0.1.1 | 2023 年 3 月 29 日 |
0.1.0 | 2023 年 3 月 29 日 |
#2174 in Rust 模式
17KB
253 行
INew – 构造函数生成库
在 Rust 中,编写构造函数是常见的,但可能会很重复且乏味。这个库简化了这个过程,使它更加有趣,并为更有趣的任务释放时间。
该库的目的是覆盖最基本和最常见的情况。如果您需要更复杂的生成,可能需要查看 rust-derive-builder
如何将库添加到您的项目中?
只需将其添加到 Cargo.toml 中
[dependencies]
inew = "0.2.2"
最低支持的 Rust 版本
该库需要最低的 Rust 版本为 1.56.0
,并在 CI 环境中利用此版本执行测试。
示例
假设您有一个结构和构造函数,我们想要为它创建一个构造函数。它看起来像这样
struct MyStruct {
x: u32,
y: u16,
z: String,
field: String,
another_field: String
}
impl MyStruct {
pub fn new(x: u32,
y: u16,
z: String,
field: String,
another_field: String) -> Self {
Self {
x,
y,
z,
field,
another_field
}
}
}
但这里的一切都非常明显,所有字段和类型都是编译器已知的。因此,我们可以将构造函数生成交给宏
use inew::New;
#[derive(New)]
struct MyStruct {
x: u32,
y: u16,
z: String,
field: String,
another_field: String
}
就是这样,只需添加 New 注解
默认字段和用于生成字段的自定义函数
如果您不想传递所有字段,可以使用注解来填写一些字段,例如使用 #[new(default)]
进行初始化,或使用 #[new(default = my_func_name())]
通过调用 my_func_name() 进行初始化。使用示例
use inew::New;
#[derive(New)]
struct MyAwesomeStruct {
name: String,
#[new(default)]
entries: Vec<u32>,
#[new(default)]
some_values: std::collections::HashSet<u32>,
#[new(default = custom_func())]
custom_value: u32
}
fn custom_func() -> u32 {
42u32
}
fn main() {
MyAwesomeStruct::new("123".to_owned())
}
#[new(default = ...)] 属性可以接受任何有效的 Rust 表达式作为其参数,例如 1 + 1 或 vec![1]。
自定义名称和隐私
也可以使用属性配置隐私并重命名构造函数。
隐私
#[derive(New)]
#[new(pub = false)]
struct MyStruct {
x: u32,
}
fn main() {
MyStruct::new(1) // now it's a private function
}
自定义名称
#[derive(New)]
#[new(rename = "create")]
struct MyStruct {
x: u32,
}
fn main() {
MyStruct::create(1)
}
泛型和生命周期
泛型和生命周期受支持且正常工作
泛型
use inew::New;
#[derive(New)]
struct MyStruct<A, B> {
x: u32,
y: A,
z: B,
}
fn main() {
MyStruct::new(1u32, 2u64, 3u16)
}
生命周期
use inew::New;
#[derive(New)]
struct MyStruct<'a> {
x: u32,
y: &'a u16,
}
fn main() {
let y = 1u16;
MyStruct::new(x, &y)
}
无名称结构体
无名称结构体也完全受支持
use inew::New;
#[derive(New)]
struct MyStruct(u32);
fn main() {
MyStruct::new(1)
}
特别感谢
- Chat GPT-4,它帮助我编写了所有这些文档,并纠正了代码中的大量错误
- Kristina,她是我的灵感来源
- Stable Diffusion,它帮助我创建标志 :-)
许可
根据您的选择,在 Apache License 2.0 或 MIT 许可证下获得许可。
贡献
欢迎任何贡献。只需编写测试并提交合并请求
与 derive-new 的区别
有一个非常相似的库,具有几乎相同的特性和语法。 derive-new 以下是在表格中列出的一些区别。
特性 | INew | derive-new |
---|---|---|
支持默认值 | 是 | 是 |
支持泛型和生命周期 | 是 | 是 |
枚举支持 | 否 | 是 |
构造函数隐私设置 | 是 | 否 |
构造函数重命名 | 是 | 否 |
支持无名称结构体 | 是 | 是 |
相关项目
rust
rust-derive-builder derive-new derive_more
java
非库
功能也内置在 Scala、Kotlin 和 Java 语言中,用于实体如 case class
、data class
、record
。
依赖项
~1.5MB
~35K SLoC