• 枚举类型

    枚举类型

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

    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