表格

表是具有键和值的条目的集合。它们是提供的唯一聚合数据结构。所有其他数据结构(数组、列表、集合等)都是从表中构建的。表键和值可以是任何类型,包括其他表。同一表中的键和值可以混合类型。

  • 表构造函数
  • 表使用情况
  • 表格作为数组
  • 表格作为记录

表构造函数

表构造函数允许您指定具有键和关联值的表。语法是:

{[key1] = value1, [key2] = value2, …}

其中键和值是表达式。如果键是不是保留字的字符串,则可以省略键周围的括号和引号。示例:

{key1 = “value1”, key2 = “value2”, key3 = “value3”}

{} 简单地指定一个空表。

在赋值中可以使用表构造函数来设置一个变量来引用表。示例:

local t1 = {} – set t1 to an empty table local t2 = {key1 = “value1”, key2 = “value2”, key3 = “value3”}

请注意,表本身是匿名的。多个变量可能引用同一个表。继续上面的例子:

本地 t3 = t2-t2 和 t3 都是指同一个表

表格使用

正如您所期望的那样,您可以使用键来查找表中的值。语法是表[key],其中表是表引用(通常是分配给表的变量),键是提供键的表达式。如果在表达式中使用,并且该键存在于表中,则返回与该键关联的值。如果密钥不在表中,则返回 nil。如果将其用作赋值中的变量,并且该键不存在于表中,则会为键和值创建一个新条目。如果表中已存在密钥,则会将密钥的值替换为新值。示例:

local t = {} – sets t to an empty table t[“k1”] = “v1” – creates an entry for key “k1” and value “v1” v1 = t[“k1”] – sets v1 to the value for key “k1” = “v1” t[“k1”] = “new_v1” – sets the value for key “k1” to “new_v1”

表格作为数组

传统数组可以使用具有整数键作为索引的表来实现。一个数组可以有任何索引,包括负索引,但约定是在索引 1 处启动数组(而不是像 C 和 Java 这样的语言那样 0)。这样的数组有一个特殊用途的表构造函数:

{value1, value2, value3, … }

数组引用然后是数组[索引]。

length 运算符 # 返回连续索引从 1 开始的数组中元素的数量。示例:

local a = {“value1”, “value2”, “value3”} local length = #a – sets length to the length of array a = 3

数组可以是稀疏的,其中只有定义的元素被分配。但 # 不能用于具有非连续索引的稀疏数组。示例:

local sparse_array = {} – set up an empty array sparse_array[1] = “value1” – add an element at index 1 sparse_array[99] = “value99” – add an element at index 99

多维数组可以设置为表的表。例如,可以通过以下方式设置 3x3 矩阵:

local m = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9} } local v22 = m[2][2] – sets v22 to 5

表格作为记录

带有字段的记录可以作为带有字段名称键的表实现。参考表单表格 .field 可用于表格[“字段”]。示例:

local person = {name = “John Smith”, phone = “777-777-7777”} local name = person.name – sets name to “John Smith”

表数组可用于一系列记录。示例:

local people = { {name = “John Smith”, phone = “777-777-7777”}, {name = “Jane Doe”, phone = “888-888-8888”} … }

name = people[2].name – sets name to “Jane Doe”

表格