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 模式

MIT/Apache

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

lombok

非库

功能也内置在 Scala、Kotlin 和 Java 语言中,用于实体如 case classdata classrecord

依赖项

~1.5MB
~35K SLoC