#enums #macro #nested #flat #expand #flattened

flat_enum

将嵌套枚举展开成扁平枚举

1 个不稳定版本

0.1.0 2024年1月22日

#1909数据结构

MIT 许可证

9KB
90

关于 flat_enum crate

此crate扩展嵌套枚举。请参见示例

# use flat_enum::{flat, into_flat, FlatTarget};
#[derive(FlatTarget)]
pub enum Enum1<A> {
    E1(A),
    E2(),
    E3(String),
}

#[into_flat(Enum2Flat<A>)]
pub enum Enum2<A> {
    #[flatten]
    Enum1(Enum1<A>),
    E4,
}

#[flat(Enum2<A>)]
pub enum Enum2Flat<A> {}

在宏调用中,Enum2Flat 展开成类似

pub enum Enum2Flat<A> {
    E1(A),
    E2(),
    E3(String),
    E4,
}

在这个例子中,Enum1Enum2 不必定义在同一个crate中。但 Enum2Enum2Flat 应该在相同的上下文中定义(模块)。

动机

内存压缩

Rust中枚举的内存表示中,除了每个变体的字段值外,还有一个std::mem::Disctiminant值。如果两个枚举嵌套,则内存中应该有两个区分值。编译器的优化算法不会做这样的工作。

此crate提供了一种自动生成扁平枚举的方法来处理这个问题。

语法糖

当在类似match的表达式中使用嵌套枚举类型的值时,匹配器很容易变得复杂。扁平枚举解决了这个问题。

依赖关系

~1.5MB
~36K SLoC