2个不稳定版本
0.2.0 | 2024年6月16日 |
---|---|
0.1.0 | 2023年12月30日 |
#26 在 #下转换
每月 下载 43 次
用于 5 个crate(通过 enum_downcast)
16KB
301 行
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
功能来使用派生宏。
您可以在 /examples 中查看更多示例。
我最喜欢的一个是关于自定义下转换的示例,它允许一些有趣的行为:https://github.com/ryo33/enum_downcast/blob/75adcbc8d24adb4e9d7b3c873e92bfff0dde7882/examples/partial_custom_impl.rs#L44-L53
功能
- 完全
#![no_std]
- 没有不安全代码(例如
std::mem::transmute
) - 没有动态分派
#[enum_downcast(skip)]
来跳过一些变体(特别是不可下转换的变体)- 带有类型参数的枚举(请参阅 示例)
- 不带派生宏的自定义下转换实现(请参阅 示例)
- 对于一些变体使用
#[enum_downcast(skip)]
的部分自定义下转换实现(请参阅 示例) - 与其他宏兼容,例如
serde
、strum
和enum_dispatch
(请参阅与serde
和strum
的 示例 以及与enum_dispatch
的 示例)
有一个限制:由于稳定版Rust中缺乏特化,您不能编译将枚举向下转换为枚举定义中未列出的任何类型的代码。您可以通过使用带有min_specialization
功能的夜间编译器来解决这个问题,就像这个例子一样。随着特化在未来的稳定,这个限制将得到解决,您不需要像示例中那样的样板代码。
依赖项
~320–780KB
~19K SLoC