结论:C/Java 的枚举只是"一组命名常量",每个变体不带数据;Rust 的枚举是代数数据类型(ADT)中的和类型——每个变体可以携带不同类型和数量的数据,配合 match 做穷尽分解。OptionResult 都是它的普通应用。

展开:这个差异改变了建模方式。C 里表达"消息可能是文本或图片"要靠 struct { type; union {...} } 手工打标签,标签和数据的一致性靠自觉;Rust 里 enum Msg { Text(String), Image(Vec<u8>) } 由类型系统保证访问数据前必须先匹配变体,不可能拿文本分支去读图片数据。内存布局上,enum 大小约等于最大变体加判别标签,编译器还会做空位优化(niche optimization),如 Option<&T>&T 同尺寸。易错点:enum 变体共享同一类型,想让不同变体有不同行为要靠 match 或把行为下沉到变体携带的 trait object。

enum Msg { Quit, Move { x: i32, y: i32 }, Text(String) }
fn handle(m: Msg) {
    match m {
        Msg::Quit => println!("quit"),
        Msg::Move { x, y } => println!("to ({x},{y})"),
        Msg::Text(s) => println!("{s}"),
    }
}

追问方向:状态机如何用 enum 编码(typestate 模式)、与 trait object 的取舍。