#枚举 #downcast #variant #skip #macro #derive

enum_downcast

枚举的安全下转换

2个不稳定版本

0.2.0 2024年6月16日
0.1.0 2023年12月30日

#553 in Rust模式

Download history 11/week @ 2024-05-25 2/week @ 2024-06-01 1/week @ 2024-06-08 205/week @ 2024-06-15 3/week @ 2024-06-22 9/week @ 2024-07-06 19/week @ 2024-08-03 89/week @ 2024-08-10

每月108次下载
4 个crate中使用 (via vyder_core)

MIT/Apache

8KB
52

enum_downcast

GitHub MIT/Apache 2.0 Crates.io docs.rs

枚举的安全下转换

示例

#[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)] 进行部分自定义下转换实现(见 示例
  • 与其他宏兼容,例如 serdestrumenum_dispatch(见 使用 serde 和 strum 的示例使用 enum_dispatch 的示例

存在一个限制:由于稳定版Rust中缺乏特殊化,您不能编译将枚举向下转换为枚举定义中未列出的任何类型的代码。您可以像这个示例一样使用带有min_specialization功能的夜间编译器来解决这个问题。随着未来特殊化的稳定,这个限制将被消除,您不需要像示例中那样的样板代码。

依赖项

约110KB