#枚举 #下转换 #派生 #变体 #enum-downcast

enum_downcast_derive

为enum_downcast提供派生功能

2个不稳定版本

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

#26#下转换

每月 下载 43
用于 5 个crate(通过 enum_downcast

MIT/Apache

16KB
301

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 功能来使用派生宏。

您可以在 /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)] 的部分自定义下转换实现(请参阅 示例
  • 与其他宏兼容,例如 serdestrumenum_dispatch(请参阅与 serdestrum示例 以及与 enum_dispatch示例

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

依赖项

~320–780KB
~19K SLoC