元组
一个元组类型定义不同的命名域以及域的顺序。构造器()可以用来构造元组。构造器中的域的顺序必须和元组定义的域的顺序一致。不同的元组类型是相同的如果它们的指定域在相同的顺序中有相同的类型以及相同的名字。
元组的赋值操作赋值每个要素。标记t.field用于访问一个元组的部分。另一个符号是t[i]访问第i个部分。这里i需要是一个常数。
type
Person = tuple[name: string, age: int] # type representing a person:
# a person consists of a name
# and an age
var
person: Person
person = (name: "Peter", age: 30)
# the same, but less readable:
person = ("Peter", 30)
echo(person.name) # "Peter"
echo(person.age) # 30
echo(person[0]) # "Peter"
echo(person[1]) # 30
# You don't need to declare tuples in a separate type section. 你不需要在一个单独的类型部分声明元组
var building: tuple[street: string, number: int]
building = ("Rue del Percebe", 13)
echo(building.street)
# The following line does not compile, they are different tuples! 下面的行不能编译,它们是不同的元组
#person = building
# --> Error: type mismatch: got (tuple[street: string, number: int])
# but expected 'Person'
# The following works because the field names and types are the same. 下面的有效因为元组的域名称和类型相同
var teacher: tuple[name: string, age: int] = ("Mark", 42)
person = teacher
即你不需要使用type声明一个元组,元组用不同的域名称创建将会被认为不同的对象,尽管它们有相同的字段类型。
元组可以被拆箱在变量赋值期间(and only then!)。这可以方便的直接分配元组领域的单独命名变量。这方面的一个例子是从OS模块同时返回目录,名字和一个路径的拓展名的splitfile过程。元组拆包工作要围绕你想指定的开箱的值使用括号,否则你将所有的个体变量分配相同的值!例如:
import os
let
path = "usr/local/nimc.html"
(dir, name, ext) = splitFile(path)
baddir, badname, badext = splitFile(path)
echo dir # outputs `usr/local`
echo name # outputs `nimc`
echo ext # outputs `.html`
# All the following output the same line:
# `(dir: usr/local, name: nimc, ext: .html)`
echo baddir
echo badname
echo badext
元组拆箱只工作在var或let块。下面的代码不能编译:
import os
var
path = "usr/local/nimc.html"
dir, name, ext = ""
(dir, name, ext) = splitFile(path)
# --> Error: '(dir, name, ext)' cannot be assigned to