#default #enums #const #init #fallback

devault

Default trait派生的更灵活的替代方案

2个不稳定版本

0.2.0 2023年11月11日
0.1.0 2021年7月11日

#1525 in 过程宏

Download history 492/week @ 2024-03-14 468/week @ 2024-03-21 656/week @ 2024-03-28 435/week @ 2024-04-04 465/week @ 2024-04-11 519/week @ 2024-04-18 569/week @ 2024-04-25 642/week @ 2024-05-02 753/week @ 2024-05-09 640/week @ 2024-05-16 367/week @ 2024-05-23 583/week @ 2024-05-30 739/week @ 2024-06-06 839/week @ 2024-06-13 470/week @ 2024-06-20 704/week @ 2024-06-27

每月2,908次下载
2 crates 中使用

MIT/Apache

19KB
318 代码行

devault Actions状态 Crates.io Crates.io docs.rs

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