2个不稳定版本
0.2.0 | 2024年6月16日 |
---|---|
0.1.0 | 2023年12月30日 |
#553 in Rust模式
每月108次下载
在 4 个crate中使用 (via vyder_core)
8KB
52 行
enum_downcast
枚举的安全下转换
示例
#[derive(EnumDowncast)]
enum Enum {
Player(Player),
Enemy(Enemy),
Items { vec: Vec<Item> }, // derived code will be identical to if it were `Items(Vec<Items>)`
#[enum_downcast(skip)]
Other,
}
let container = Enum::Player(Player { name: "Ryo".to_string() });
let _player_ref: &Player = container.downcast_ref::<Player>().unwrap();
let _player_mut: &mut Player = container.downcast_mut::<Player>().unwrap();
let player: Player = container.downcast::<Player>().unwrap();
您需要 derive
功能才能使用 derive 宏。
您可以在 /examples 中查看更多示例。
我最喜欢的一个是关于自定义下转换的示例,它允许有趣的行为:https://github.com/ryo33/enum_downcast/blob/75adcbc8d24adb4e9d7b3c873e92bfff0dde7882/examples/partial_custom_impl.rs#L44-L53
特性
- 完全
#![no_std]
- 没有不安全代码 (如
std::mem::transmute
) - 没有动态分发
#[enum_downcast(skip)]
跳过一些变体(特别是不可下转换的变体)- 具有类型参数的枚举(见 示例)
- 无需 derive 宏即可进行自定义下转换实现(见 示例)
- 对某些变体使用
#[enum_downcast(skip)]
进行部分自定义下转换实现(见 示例) - 与其他宏兼容,例如
serde
、strum
和enum_dispatch
(见 使用 serde 和 strum 的示例 和 使用 enum_dispatch 的示例)
存在一个限制:由于稳定版Rust中缺乏特殊化,您不能编译将枚举向下转换为枚举定义中未列出的任何类型的代码。您可以像这个示例一样使用带有min_specialization
功能的夜间编译器来解决这个问题。随着未来特殊化的稳定,这个限制将被消除,您不需要像示例中那样的样板代码。
依赖项
约110KB