枚举类型
一个枚举类型变量只能被赋值一个有限的集合。这个集合有有序的符号组成。每个符号内部映射到一个整数值。第一个符号在运行时用0表示,第二个用1表示等等。例如:
type
Direction = enum
north, east, south, west
var x = south # `x` is of type `Direction`; its value is `south`
echo($x) # writes "south" to `stdout`
所有的比较运算符都可以用枚举类型。
一个枚举符号可以避免歧义:Direction.south。
$操作符可以将任何枚举类型的值转换为它的名字,ord过程转化为它们基本的整数值。
为了更好的连接到其他语言中,枚举类型符号可以被赋值一个明确的序号值。然而,这个序号值必须是升序类型。一个符号的有序值没有明确的给出将会被赋值为前一个符号值+1.
一个明确的有序枚举可以有孔 (注:一个明确的有序类型的序数值可以不是连续的值)
type
MyEnum = enum
a = 2, b = 4, c = 89
序数类型
连续的枚举类型,整形,字符,以及布尔类型(和子类型)称作序数类型。序数类型有相当多的特殊操作:
操作 |
描述 |
ord(x) |
返回x的整型值 |
inc(x) |
x的值+1 |
inc(x, n) |
x的值+n,n为整数 |
dec(x) |
x的值-1 |
dec(x, n) |
x的值-n,n为整数 |
succ(x) |
返回x的下一个值 |
succ(x, n) |
返回x后的第n个值 |
pred(x) |
返回x的前一个值 |
pred(x, n) |
返回x的第前n个值 |
inc,dec,succ,pred操作会失败通过产生EOutOfRange(越界),EOverflow(溢出)异常。(如果代码编译已经有适当的运行时检查打开)
子类型
子类型是一个来自整形或者枚举类型(基本类型)的范围值。例如:
type
Subrange = range[0..5]
Subrange是一个int的子类型,它只能容纳从0到5的值。给Subrange子类型变量赋任何值都会出现编译或运行时错误。从基本类型给它的一个子类型赋值是允许的(反之亦然)。
系统模型定义了重要的自然类型范围 0...high(int)。其他编程语言授权自然类型使用无符号数。
这通常是错误的:你不想无符号计算仅仅是因为这个数不能为负。nim的自然类型帮助避免这种常见的编程错误。