元组和对象类型
元组或对象类型的变量是异构存储容器。元组或对象定义了一个类型的各类 字段 。元组还定义了字段的 顺序 。 元组是有很少抽象可能性的异构存储类型。 () 可用于构造元组。构造函数中字段的顺序必须与元组定义的顺序相匹配。 如果它们以相同的顺序指定相同类型的相同字段,则不同的元组类型 等效 。字段的 名称 也必须相同。
type
Person = tuple[name: string, age: int] # 表示人的类型:
# 由名字和年龄组成。
var person: Person
person = (name: "Peter", age: 30)
assert person.name == "Peter"
# 一样,但可读性不太好
person = ("Peter", 30)
assert person[0] == "Peter"
assert Person is (string, int)
assert (string, int) is Person
assert Person isnot tuple[other: string, age: int] # `other` 是不同的标识符
可以使用括号和尾随逗号,构造具有一个未命名字段的元组:
proc echoUnaryTuple(a: (int,)) =
echo a[0]
echoUnaryTuple (1,)
事实上,每个元组结构都允许使用尾随逗号。
字段将会对齐,以此获得最佳性能。对齐与 C 编译器的方式兼容。
为了与 object 声明保持一致, type 部分中的元组也可以用缩进而不是 [] 来定义:
type
Person = tuple # 代表人的类型
name: string # 人的名字
age: Natural # 以及年龄
对象提供了许多元组没有的特性。对象提供继承和隐藏其他模块字段的能力。启用继承的对象在运行时具有相关类型的信息,可以使用 of 运算符来确定对象的类型。 of 运算符类似于 Java 中的 instanceof 运算符。
type
Person = object of RootObj
name*: string # *表示可以从其他模块访问 `name`
age: int # 没有 * 表示该字段已隐藏
Student = ref object of Person # 学生是人
id: int # 有个 id 字段
var
student: Student
person: Person
assert(student of Student) # 是真
assert(student of Person) # 也是真
对模块外部可见的对象字段必须用 * 标记。与元组相反,不同的对象类型永远不会 等价 。没有祖先的对象是隐式的 final ,因此没有隐藏的类型字段。 可以使用 inheritable 编译指示来引入除 system.RootObj 之外的新根对象。
type
Person = object # final 对象的例子
name* : string
age: int
Student = ref object of Person # 错误: 继承只能用于非 final 对象
id: int
对于元组和对象的赋值操作,将拷贝每个组件。 重写这种拷贝行为的方法描述在这里。
当前内容版权归 vectorworkshopbaoerjie 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 vectorworkshopbaoerjie .