枚举类型
枚举类型定义一个新类型,其值由指定的值组成。这些值是有序的。例:
- type
- Direction = enum
- north, east, south, west
现在以下内容成立:
- ord(north) == 0
- ord(east) == 1
- ord(south) == 2
- ord(west) == 3
- # 也允许:
- ord(Direction.west) == 3
因此, north < east < south < west 。 比较运算符可以与枚举类型一起使用。 枚举值也可以使用它所在的枚举类型 Direction.nort 来限定,而不是 north 等。
为了更好地与其他编程语言连接,可以为枚举类型的字段分配显式序数值。 但是,序数值必须按升序排列。 未明确给出序数值的字段被赋予前一个字段+ 1的值。
显式有序枚举可以有 洞 :
- type
- TokenType = enum
- a = 2, b = 4, c = 89 # 洞是合法的
但是,它不再是序数,因此不可能将这些枚举用作数组的索引类型。 过程 inc, dec, succ 和 pred 对于它们不可用。
编译器支持枚举的内置字符串化运算符 $ 。 字符串化的结果可以通过显式给出要使用的字符串值来控制:
- type
- MyEnum = enum
- valueA = (0, "my value A"),
- valueB = "value B",
- valueC = 2,
- valueD = (3, "abc")
从示例中可以看出,可以通过使用元组指定字段的序数值及其字符串值。 也可以只指定其中一个。
枚举可以使用 pure 编译指示进行标记,以便将其字段添加到特定模块特定的隐藏作用域,该作用域仅作为最后一次尝试进行查询。 只有没有歧义的符号才会添加到此范围。 但总是可以通过写为 MyEnum.value 的类型限定来访问:
- type
- MyEnum {.pure.} = enum
- valueA, valueB, valueC, valueD, amb
- OtherEnum {.pure.} = enum
- valueX, valueY, valueZ, amb
- echo valueA # MyEnum.valueA
- echo amb # 错误:不清楚它是MyEnum.amb还是OtherEnum.amb
- echo MyEnum.amb # OK.
要使用枚举实现位字段,请参阅 Bit fields