2个不稳定版本
0.2.0 | 2023年11月11日 |
---|---|
0.1.0 | 2021年7月11日 |
#1525 in 过程宏
每月2,908次下载
在 2 crates 中使用
19KB
318 代码行
devault
Default trait派生的更灵活的替代方案。
使用Devault
的行为与使用Default
相同,但提供了一些额外的优势。
额外优势
devault 允许为字段指定特定的默认值,即使它们的类型没有实现 Default
。
use devault::Devault;
const C: u32 = 10;
#[derive(Debug, Devault, PartialEq)]
struct Foo {
a: u8,
#[devault("1.0")]
b: f32,
#[devault("C")]
c: u32,
#[devault("Bar(0.5)")]
d: Bar,
}
#[derive(Debug, PartialEq)]
struct Bar(f32);
fn main() {
let foo = Foo::default();
assert_eq!(foo.a, 0);
assert_eq!(foo.b, 1.0);
assert_eq!(foo.c, C);
assert_eq!(foo.d, Bar(0.5));
}
它也可以用于枚举,前提是必须提供默认值。
use devault::Devault;
#[derive(Debug, Devault, PartialEq)]
#[devault("Foo::B(128)")]
enum Foo {
A,
B(u8),
}
fn main() {
assert_eq!(Foo::default(), Foo::B(128));
}
devault 可以生成关联常量和/或函数,用于在 Default
实现之外构造字段的默认值。
use devault::Devault;
#[derive(Debug, Devault, PartialEq)]
struct Foo {
#[devault("1.0", constant)]
a: f32,
#[devault("10", function)]
b: u32,
#[devault("0.5", constant = "INIT_C", function = "start_c")]
c: f32,
}
#[derive(Debug, Devault, PartialEq)]
#[devault("Bar::B(42)", constant)]
enum Bar {
A,
B(u8),
}
fn main() {
assert_eq!(Foo::DEFAULT_A, 1.0);
assert_eq!(Foo::default_b(), 10);
assert_eq!(Foo::INIT_C, 0.5);
assert_eq!(Foo::start_c(), 0.5);
assert_eq!(Bar::DEFAULT, Bar::B(42));
}
待办事项
- 支持泛型类型。
依赖关系
~1.5MB
~35K SLoC