枚举类型
枚举类型定义了一个其值由指定的值组成的新类型,这些值是有序的。例如:
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。比较运算符可以与枚举类型一起使用。枚举值也可以使用它所在的枚举类型来限定,如 north 可以用 Direction.nort 来限定。
为了更好地与其他编程语言连接,可以显式为枚举类型字段分配序数值,但是,序数值必须升序排列。未明确给出序数值的字段被赋予前一个字段 +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.
枚举值的名称是可重载的,就像例程。如果枚举 T 和 U 都有一个名为 foo 的成员,那么标识符 foo 要在 T.foo 和 U.foo 之间二选一。在重载解析过程中, foo 的最终类型由上下文决定。如果 foo 的类型不明确,将产生静态错误。
type
E1 = enum
value1,
value2
E2 = enum
value1,
value2 = 4
const
Lookuptable = [
E1.value1: "1",
# 不需要再修饰value2,已经知道是E1.value2。
value2: "2"
]
proc p(e: E1) =
# 在 'case' 语句中消除歧义。
case e
of value1: echo "A"
of value2: echo "B"
p value2
在某些情况下,枚举的歧义取决于当前作用域与枚举定义所在作用域之间的关系。
# a.nim
type Foo* = enum abc
# b.nim
import a
type Bar = enum abc
echo abc is Bar # true
block:
type Baz = enum abc
echo abc is Baz # true
对于用枚举实现位域,请查看位域部分。
当前内容版权归 vectorworkshopbaoerjie 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 vectorworkshopbaoerjie .