Enums 铁锈中的静态枚举

Enums 铁锈中的静态枚举,enums,rust,static,Enums,Rust,Static,是否可以定义一个枚举而不用担心Rust中的内存分配 假设以下是我的枚举的定义 发布枚举方向{ 北, 南方 东方,, 西, } 我想知道是否可以在代码中引用相同的sayOrientation::North 以下代码是否生成两个独立的North let o1 = Orientation::North; let o2 = Orientation::North; 我知道我可以通过如下定义静态变量来实现它。 有没有更好(语法上更安全/更简单/更干净)的方法来做同样的事情 pub enum Orient

是否可以定义一个枚举而不用担心Rust中的内存分配

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

发布枚举方向{
北,
南方
东方,,
西,
}
我想知道是否可以在代码中引用相同的say
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;

您在运行时询问的代码与您编写的代码相同:

let o1: u8 = 0;
let o2: u8 = 0;
枚举为您提供了对实际发生情况的抽象,因此您可以同时获得效率和语法便利,以及类型检查和在忘记匹配中的变量时出现的错误

创建静态“常量”不会有任何效果,因为传递字节是您可以做的最快的事情

有没有更好(语法上更安全/更简单/更干净)的方法来做同样的事情

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;
使用枚举的“最佳”方式是尽可能最简单的方式:

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

每个变量将被编码为单个字节。在运行时,任何地方都没有存储任何内容,编译后的代码看起来就像是在比较数字字节。将
enum
变量存储为静态变量将一事无成,因为引用它们将意味着传递指针,指针是8个字节!我与Rust enum混淆的原因是它允许包装一个元素,如
enum WebEvent{KeyPress(char),}
。我假设Rust对这种情况的处理方式有所不同?@JamesParker不是真的,只是当存在关联数据时,枚举会增长到足以包含关联数据和鉴别器的程度,否则就只有鉴别器(通常是u8,除非使用自定义repr)。基本上,“基本情况”就好像相关数据是单位(空元组,
()
),大小为零,因此每个变量所需的唯一空间是判别式。