1 个不稳定版本
0.1.0 | 2024年1月22日 |
---|
#1909 在 数据结构
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,
}
在这个例子中,Enum1
和 Enum2
不必定义在同一个crate中。但 Enum2
和 Enum2Flat
应该在相同的上下文中定义(模块)。
动机
内存压缩
Rust中枚举的内存表示中,除了每个变体的字段值外,还有一个std::mem::Disctiminant
值。如果两个枚举嵌套,则内存中应该有两个区分值。编译器的优化算法不会做这样的工作。
此crate提供了一种自动生成扁平枚举的方法来处理这个问题。
语法糖
当在类似match的表达式中使用嵌套枚举类型的值时,匹配器很容易变得复杂。扁平枚举解决了这个问题。
依赖关系
~1.5MB
~36K SLoC