#枚举 # #过程宏

enum-fields

快速访问Rust中的共享枚举字段

1 个不稳定版本

0.1.0 2023年5月18日

#1021 in 过程宏

每月46次下载

MIT/Apache

11KB
111

enum-fields

Build Status Latest Version

快速访问Rust中的共享枚举字段。

安装

enum-fields包添加到您的Cargo.toml文件中

[dependencies]
enum-fields = "*"

让您的enum像这样派生自enum_fields::EnumFields

#[derive(enum_fields::EnumFields)]
pub enum MyEnum {
    ...
}

使用

以下示例展示了一个枚举Entity,它包含两个变体:CompanyPerson

/// An entity that can be either a `Company` or a `Person`.
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, enum_fields::EnumFields)]
pub enum Entity {
    Company {
        name: String,
        ceo: String,
    },

    Person {
        name: String,
    }
}

由于Entity派生了enum_fields::EnumFields,它现在包含两个字段访问函数(获取器):Entity::name()Entity::ceo()

let company = Entity::Company {
    name: "Apple".into(),
    ceo: "Tim Cook".into()
};

let person = Entity::Person {
    name: "Tim Berners-Lee".into()
};

println!("Company with CEO: {} named: {}",
    company.ceo().unwrap(),
    company.name()
);

println!("Person named: {}", person.name());

请注意,CompanyPerson都有一个名为name的字段。这强制enum-fieldsEntity::name()直接返回类型。

// Since [`Entity`] has two variants that both have the `name` field,
// `Entity::name(&self)` returns the `&String`.
assert_eq!(company.name(), "Apple");
assert_eq!(person.name(), "Tim Berners-Lee");

然而,只有Companyceo字段,因此Entity::ceo()返回一个可选的获取器:Option<&String>

// Only `Company` has field `ceo`, so it returns an `Option<&String>`,
// since a `Person` returns [`None`].
assert_eq!(company.ceo(), Some(&"Tim Cook".into()));
assert_eq!(person.ceo(), None);

许可证

根据您的选择,在Apache License, Version 2.0或MIT许可证下许可。


除非您明确声明,否则您有意提交给EnumFields的任何贡献,根据Apache-2.0许可证定义,将作为上述双重许可,不附加任何额外的条款或条件。

依赖关系

~280–730KB
~17K SLoC