【问题标题】:Static Enum in RustRust 中的静态枚举
【发布时间】:2020-06-18 13:10:31
【问题描述】:

是否可以定义一个枚举而不用担心 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;

【问题讨论】:

  • 每个变体都将被编码为一个字节。运行时任何地方都没有存储任何内容,编译后的代码看起来就像您只是在比较数字字节一样。将enum 变量存储为静态变量将一事无成,因为引用它们将意味着传递指针 - 这是 8 个字节!

标签: enums rust static


【解决方案1】:

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

let o1: u8 = 0;
let o2: u8 = 0;

枚举让您对实际发生的事情进行抽象化,因此您可以同时获得效率和语法便利,以及当您忘记匹配中的变体时的类型检查和错误。

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

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

使用枚举的“最佳”方式是最简单的方式:

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

【讨论】:

  • 我对 Rust 枚举感到困惑的原因是它可以包装像 enum WebEvent { KeyPress(char),} 这样的元素。我认为 Rust 会以不同的方式处理这种情况?
  • @JamesParker 不是真的,只是当有关联数据时,枚举会增长到足以包含关联数据判别式,否则你只有判别式(通常是 u8,除非您使用自定义 repr)。基本上,“基本情况”就好像相关数据是单位(空元组,()),其大小为零,因此每个变体所需的唯一空间是判别式。
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多