55 个版本
新增 0.8.6 | 2024 年 8 月 23 日 |
---|---|
0.8.5 | 2024 年 1 月 27 日 |
0.8.3 | 2023 年 10 月 21 日 |
0.8.1 | 2023 年 6 月 29 日 |
0.3.2 | 2018 年 12 月 27 日 |
#261 in Rust 模式
166,970 每月下载量
用于 109 个crate (16 个直接使用)
185KB
3.5K SLoC
auto_enums
一个通过自动生成枚举允许多种返回类型的库。
此crate是rust-lang/rfcs#2414中讨论的功能的过程宏实现。这个想法也被称为“匿名求和类型”。
此库提供以下属性宏
-
#[auto_enum]
解析语法,创建枚举,插入变体,并将指定的特质传递给
#[enum_derive]
。 -
#[enum_derive]
为枚举实现指定的特质。
用法
将以下内容添加到您的Cargo.toml
[dependencies]
auto_enums = "0.8"
示例
#[auto_enum]
的基本功能是使用实现了指定特质的枚举包裹显式分支(例如 match
、if
、return
等)返回的值。
use auto_enums::auto_enum;
#[auto_enum(Iterator)]
fn foo(x: i32) -> impl Iterator<Item = i32> {
match x {
0 => 1..10,
_ => vec![5, 10].into_iter(),
}
}
#[auto_enum]
在两个阶段生成代码。
首先,#[auto_enum]
将执行以下操作。
- 解析语法
- 创建枚举
- 插入变体
将生成如下代码
fn foo(x: i32) -> impl Iterator<Item = i32> {
#[::auto_enums::enum_derive(Iterator)]
enum __Enum1<__T1, __T2> {
__T1(__T1),
__T2(__T2),
}
match x {
0 => __Enum1::__T1(1..10),
_ => __Enum1::__T2(vec![5, 10].into_iter()),
}
}
其次,#[enum_derive]
实现指定的特质。
#[auto_enum]
也可以通过使用 #[nested]
属性来解析嵌套的 arms/branches。
use auto_enums::auto_enum;
#[auto_enum(Iterator)]
fn foo(x: i32) -> impl Iterator<Item = i32> {
match x {
0 => 1..10,
#[nested]
_ => match x {
1 => vec![5, 10].into_iter(),
_ => 0..=x,
},
}
}
有关更多详细信息,请参阅 文档。
支持的特质
#[enum_derive]
实现了支持的特质,并将不支持的特征传递给 #[derive]
。
#[enum_derive]
支持许多标准库特质以及一些流行的第三方库特质,如 rayon、futures、tokio、http_body。有关支持的特质完整列表,请参阅 文档。
如果您想使用 #[enum_derive]
不支持的特质,您可以使用提供 派生宏 的另一个 crate,或者您可以自己定义派生宏 (derive_utils 可能会提供帮助)。
#[enum_derive]
的基本用法
use auto_enums::enum_derive;
// `#[enum_derive]` implements `Iterator`, and `#[derive]` implements `Clone`.
#[enum_derive(Iterator, Clone)]
enum Foo<A, B> {
A(A),
B(B),
}
可选功能
std
(默认启用)- 启用使用
std
库的特质。
- 启用使用
ops
- 启用使用
[std|core]::ops
'sDeref
、DerefMut
、Index
、IndexMut
和RangeBounds
特质。
- 启用使用
convert
- 启用使用
[std|core]::convert
'sAsRef
和AsMut
特质。
- 启用使用
fmt
- 启用使用
[std|core]::fmt
除了Debug
、Display
和Write
之外的特质。
- 启用使用
transpose_methods
- 启用使用
transpose*
方法。
- 启用使用
futures03
- 启用使用 futures v0.3 特质。
futures01
- 启用使用 futures v0.1 特质。
rayon
- 启用使用 rayon 特质。
serde
- 启用使用 serde 特质。
tokio1
- 启用使用 tokio v1 特质。
tokio03
- 启用使用 tokio v0.3 特质。
tokio02
- 启用使用 tokio v0.2 特质。
tokio01
- 启用使用 tokio v0.1 特质。
http_body1
- 启用使用 http_body v1 特性。
coroutine_trait
- 启用使用
[std|core]::ops::Coroutine
特性。 - 请注意,此功能是不稳定的,可能会导致补丁版本之间的不兼容性变化。
- 启用使用
fn_traits
- 启用使用
[std|core]::ops
的Fn
、FnMut
和FnOnce
特性。 - 请注意,此功能是不稳定的,可能会导致补丁版本之间的不兼容性变化。
- 启用使用
trusted_len
- 启用使用
[std|core]::iter::TrustedLen
特性。 - 请注意,此功能是不稳定的,可能会导致补丁版本之间的不兼容性变化。
- 启用使用
type_analysis
功能
分析函数和 let
绑定的返回类型。
请注意,此功能仍然是实验性的。
示例
use auto_enums::auto_enum;
#[auto_enum] // there is no need to specify std library's traits
fn func1(x: i32) -> impl Iterator<Item = i32> {
match x {
0 => 1..10,
_ => vec![5, 10].into_iter(),
}
}
#[auto_enum]
fn func2(x: i32) {
// Unlike `feature(impl_trait_in_bindings)`, this works on stable compilers.
#[auto_enum]
let iter: impl Iterator<Item = i32> = match x {
0 => Some(0).into_iter(),
_ => 0..x,
};
}
如果您返回具有相同名称的其他特性,请小心。
相关项目
- derive_utils:一个用于轻松编写枚举 derives 宏 的过程宏助手。
- io-enum:为枚举提供 #[derive(Read, Write, Seek, BufRead)]。
- iter-enum:为枚举提供 #[derive(Iterator, DoubleEndedIterator, ExactSizeIterator, Extend)]。
许可证
根据您的选择,在 Apache 许可证,版本 2.0 或 MIT 许可证 下许可。
除非您明确声明,否则根据 Apache-2.0 许可证定义的任何有意提交以包含在作品中并由您提交的贡献,应如上所述双重许可,不附加任何其他条款或条件。
依赖项
~310–760KB
~18K SLoC