#enums #variant #derive #predicate #is

enum-methods

为每个枚举变体生成方法

8 个版本

使用旧Rust 2015

0.0.8 2017年9月15日
0.0.7 2017年8月18日
0.0.6 2017年7月24日

#1305 in 过程宏

Download history 93/week @ 2024-03-11 111/week @ 2024-03-18 81/week @ 2024-03-25 143/week @ 2024-04-01 69/week @ 2024-04-08 99/week @ 2024-04-15 109/week @ 2024-04-22 93/week @ 2024-04-29 86/week @ 2024-05-06 88/week @ 2024-05-13 98/week @ 2024-05-20 101/week @ 2024-05-27 114/week @ 2024-06-03 63/week @ 2024-06-10 92/week @ 2024-06-17 79/week @ 2024-06-24

369 每月下载

Apache-2.0

25KB
441

enum-methods

Build Status crates.io

枚举获取器/is_* 方法生成。

请注意,此crate是不稳定的,可能会频繁更改。

在达到0.1.0后,我将尝试避免严重的破坏性更改。

链接

使用方法

在您的 Cargo.toml 中,在 [dependencies] 部分下添加此行

enum-methods = "0.0.8"

要使用,只需派生并调用方法(请参阅下面的示例)。

为什么?

通常,当您编写一个包含一个或零个值的枚举时,您可能希望为它们添加一组获取器。因此

#[derive(Debug)]
enum MyEnum {
    FooBarBaz(i64),
    BazBarFoo(String),
    // ... and others
}

impl MyEnum {
    pub fn foo_bar_baz(&self) -> i64 {
        if let &MyEnum::FooBarBaz(i) = self {
            i
        }
        else {
            panic!("called MyEnum::FooBarBaz() on {:?}", self)
        }
    }
    // et cetera
}

但这很麻烦,并且为这种简单功能添加了大量代码。进入 enum-methods

您不需要使用 if let ... else { panic!(...) } 来完成上述操作,只需从 EnumIntoGetters 派生即可。

#[macro_use]
extern crate enum_methods;

#[derive(EnumIntoGetters, EnumAsGetters, EnumIsA, Debug)]
enum MyEnum {
    FooBarBaz(i64),
    BazBarFoo(String),
    // ... and others
}

fn main() {
    let my_foo = MyEnum::FooBarBaz(42);
    // EnumIsA - creates is_* methods for every member
    if my_foo.is_foo_bar_baz() {
        // EnumAsGetters - gets a reference to the enum, panicking if it is
        // not the specified variant
        assert_eq!(*my_foo.as_foo_bar_baz(), 42);
        // EnumIntoGetters - consumes the enum, yielding its owned value,
        // and panicking if it is not the specified variant
        assert_eq!(my_foo.into_foo_bar_baz(), 42);
    }
}

要求和注意事项

目前,enum-methods 有四个可派生的选项

  • EnumAsGetters 用于生成 as_* 方法,它返回一个引用。
  • EnumIntoGetters 用于生成 into_* 方法,它消耗枚举并返回由变体持有的数据。
  • EnumToGetters 用于生成 to_* 方法,它返回由变体持有的数据的副本。
  • EnumIsA 用于生成 is_* 方法,它返回一个布尔值,指示枚举是否与该变体匹配。

EnumAsGettersEnumIntoGettersEnumToGetters 有一些限制。

  • 具有恰好1个成员的任何枚举变体都将为其生成获取器。所有其他变体都被忽略。
  • EnumIntoGetters 派生的枚举必须也派生自 Debug - 这是在调用错误变体时需要 panic! 的情况。

此外,EnumToGetters 仅适用于实现了 Clone 的枚举变体。目前尚不支持

EnumIsA 比之前的更简单;它仅仅添加了返回布尔值的 is_* 方法,用于判断变体是否匹配。

对于所有生成的函数,所有名称都自动转换为 snake_case.

许可证

本软件根据 Apache 许可证 2.0 发布。有关详细信息,请参阅 LICENSE 文件。

依赖项

~1.5MB
~41K SLoC