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