枚举类型

枚举类型定义一个新类型,其值由指定的值组成。这些值是有序的。例:

  1. type
  2. Direction = enum
  3. north, east, south, west

现在以下内容成立:

  1. ord(north) == 0
  2. ord(east) == 1
  3. ord(south) == 2
  4. ord(west) == 3
  5.  
  6. # 也允许:
  7. ord(Direction.west) == 3

因此, north < east < south < west 。 比较运算符可以与枚举类型一起使用。 枚举值也可以使用它所在的枚举类型 Direction.nort 来限定,而不是 north 等。

为了更好地与其他编程语言连接,可以为枚举类型的字段分配显式序数值。 但是,序数值必须按升序排列。 未明确给出序数值的字段被赋予前一个字段+ 1的值。

显式有序枚举可以有

  1. type
  2. TokenType = enum
  3. a = 2, b = 4, c = 89 # 洞是合法的

但是,它不再是序数,因此不可能将这些枚举用作数组的索引类型。 过程 inc, dec, succpred 对于它们不可用。

编译器支持枚举的内置字符串化运算符 $ 。 字符串化的结果可以通过显式给出要使用的字符串值来控制:

  1. type
  2. MyEnum = enum
  3. valueA = (0, "my value A"),
  4. valueB = "value B",
  5. valueC = 2,
  6. valueD = (3, "abc")

从示例中可以看出,可以通过使用元组指定字段的序数值及其字符串值。 也可以只指定其中一个。

枚举可以使用 pure 编译指示进行标记,以便将其字段添加到特定模块特定的隐藏作用域,该作用域仅作为最后一次尝试进行查询。 只有没有歧义的符号才会添加到此范围。 但总是可以通过写为 MyEnum.value 的类型限定来访问:

  1. type
  2. MyEnum {.pure.} = enum
  3. valueA, valueB, valueC, valueD, amb
  4.  
  5. OtherEnum {.pure.} = enum
  6. valueX, valueY, valueZ, amb
  7.  
  8.  
  9. echo valueA # MyEnum.valueA
  10. echo amb # 错误:不清楚它是MyEnum.amb还是OtherEnum.amb
  11. echo MyEnum.amb # OK.

要使用枚举实现位字段,请参阅 Bit fields