Rust中的静态枚举

4

在Rust中,是否可以定义一个枚举而无需担心内存分配?

假设以下是我的枚举定义。

pub enum Orientation {
    North,
    South,
    East,
    West,
}

我想知道是否有可能在代码中引用同一个实例,例如 Orientation::North

以下代码是否会生成两个不同的 North 实例?

let o1 = Orientation::North;
let o2 = Orientation::North;

我知道可以通过定义静态变量来实现,如下所示。 是否有更好(语法更安全/更简单/更清晰)的方法来完成相同的事情?

pub enum Orientation {
    North,
    South,
    East,
    West,
}

static NORTH: Orientation = Orientation::North;
static SOUTH: Orientation = Orientation::South;
static WEST: Orientation = Orientation::West;
static EAST: Orientation = Orientation::East;

1
每个变量将被编码为单个字节。在运行时没有任何存储,编译后的代码看起来就像是比较数字字节一样。将“枚举”变量存储为静态变量将毫无意义,因为引用它们将意味着传递指针-这些指针占用8个字节! - Peter Hall
1个回答

9
您所询问的代码在运行时与您编写以下代码完全相同:
let o1: u8 = 0;
let o2: u8 = 0;

枚举类型可以让你在代码中抽象出实际发生的事情,从而使你获得效率和语法上的便利,同时还提供了类型检查和错误提示功能,可以让你避免忘记在匹配中添加一个变体。

创建静态“常量”并没有什么意义,因为传递字节已经是最快的操作之一。

是否有更好的(语法上更安全/更简单/更清晰)方法来做同样的事情?

使用枚举的“最佳”方式就是尽可能简单明了地使用它:

let o1 = Orientation::North;
let o2 = Orientation::North;

我对Rust枚举感到困惑的原因是它允许像enum WebEvent { KeyPress(char),}这样包装一个元素。我假设Rust会以不同的方式处理这种情况? - James Parker
2
@JamesParker 不是真的,只是当有关联数据时,枚举会增长到足以包含关联数据和判别标准的大小,否则你只有判别标准(通常是 u8,除非你使用自定义 repr)。基本上,“基本情况”就像关联数据是单元(空元组,())一样,它是零大小的,因此每个变体所需的唯一空间是判别标准。 - Masklinn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接