8 个版本
使用旧Rust 2015
0.0.8 | 2017年9月15日 |
---|---|
0.0.7 | 2017年8月18日 |
0.0.6 | 2017年7月24日 |
#1305 in 过程宏
369 每月下载
25KB
441 行
enum-methods
枚举获取器/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_*
方法,它返回一个布尔值,指示枚举是否与该变体匹配。
EnumAsGetters
、EnumIntoGetters
和 EnumToGetters
有一些限制。
- 具有恰好1个成员的任何枚举变体都将为其生成获取器。所有其他变体都被忽略。
- 从
EnumIntoGetters
派生的枚举必须也派生自Debug
- 这是在调用错误变体时需要panic!
的情况。
此外,EnumToGetters
仅适用于实现了 Clone
的枚举变体。目前尚不支持
EnumIsA
比之前的更简单;它仅仅添加了返回布尔值的 is_*
方法,用于判断变体是否匹配。
对于所有生成的函数,所有名称都自动转换为 snake_case.
许可证
本软件根据 Apache 许可证 2.0 发布。有关详细信息,请参阅 LICENSE 文件。
依赖项
~1.5MB
~41K SLoC