1 个不稳定版本

0.1.0 2024年4月21日

#712 in Rust 模式

MIT/Apache

14KB
65

fancy-default

本库为标准库的 Default derive 宏提供了增强。

Crates.io Downloads (recent) Crates.io License Crates.io Version

目录

泛型默认值配置

本库中所有默认值配置使用相同的语法。

  • 字段配置
    • #[default]:调用 core::default::Default 并将其用作默认值。

      注意:当前 core::default::Default 不是一个常量特性,因此在使用 ConstDefault 时必须指定默认值。

    • #[default = <expr>]:将 <expr> 用作此字段的默认值。

      注意better_default 不使用字符串字面量来解析表达式,因此您可以直接编写带有默认值的表达式,例如: #[default = "foobar".to_owned()]

    • #[default(expr = <expr>)]:与之前格式相同。

  • 变体配置(仅枚举)
    • #[default]:将变体设置为枚举的默认变体。
      此属性与标准库的 #[default] 属性作用相同。

fancy_default::derive::默认值

基本用法

use fancy_default::Default;

#[derive(Debug, Default, PartialEq, Eq)]
struct Person {
    #[default(expr = "no-name".to_owned())]
    name: String,
    #[default]
    id: usize,
    #[default(expr = Some("unknown".to_owned()))]
    tag: Option<String>,
}

assert_eq!(
    Person::default(),
    Person {
        name: "no-name".to_owned(),
        id: 0,
        tag: Some("unknown".to_owned()),
    }
);

fancy_default::derive::ConstDefault

基本用法

// this imports both `fancy_default::derive::ConstDefault`
// and `fancy_default::traits::ConstDefault`.
use fancy_default::ConstDefault;

#[derive(Debug, ConstDefault, PartialEq, Eq)]
struct Person<'a> {
    #[default = "no-name"]
    name: &'a str,
    #[default = 0]
    id: usize,
    #[default(expr = Some("unknown"))]
    tag: Option<&'a str>,
}

assert_eq!(
    Person::DEFAULT,
    Person {
        name: "no-name",
        id: 0,
        tag: Some("unknown"),
    }
);

fancy_default::derive::VariantDefault

为枚举的每个变体设置默认值。此 derive 宏使用一个额外的属性 variant 来设置如何生成默认值。

配置语法

  • #[variant(<config>)]:
    • const/const = <bool>:是否生成常量默认值。对应的常量名称是当前枚举的大写版本。
      默认值:false。别名:constant
    • func/func = <bool>:是否生成返回默认值的静态方法。对应的常量名称是当前枚举的小写蛇形版本,并带有 default_ 前缀。
      默认值:true。别名:fnfunction

注意: 此属性可以添加到枚举体或单个变体中。如果添加到枚举体中,将覆盖默认生成的配置。

基本用法

use fancy_default::VariantDefault;

#[derive(Debug, VariantDefault, PartialEq, Eq)]
#[variant(const)]
enum Enum {
    Plain,
    #[variant(const = false)]
    Struct {
        #[default(expr = "123".to_owned())]
        name: String,
    },
    Tuple(#[default = 10] usize),
}


assert_eq!(Enum::PLAIN, Enum::Plain);
assert_eq!(
    Enum::default_struct(),
    Enum::Struct {
        name: "123".to_owned()
    }
);

MSRV

此 derive 宏的理论最小 Rust 版本是 1.34,从该版本开始允许将 TokenStream 传递给 MetaList

许可证

本库根据 MIT 许可证Apache v2.0 许可证 许可。

依赖项

~0.7–1.2MB
~25K SLoC