表格

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

  • 表构造函数
  • 表格用法
  • 表作为数组
  • 表即记录

表构造函数

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

{[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 都指向同一个表

表格使用情况

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

local t = {} –将 t 设置为空表 t[“k1”] = “v1” - 为键“k1”创建条目和值“v1” v1 = t[“k1”] – — 将 v1 设置为键 “k1” = “v1” 的值 t[“k1”] = “new_v1” — 将键“k1”的值设置为“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 = {} – 设置一个空数组 sparse_array[1] = “value1” – 在索引 1 处添加一个元素 sparse_array[99] = “value99” — 在索引 99 处添加一个元素

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

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

表格作为记录

带有字段的记录可以作为带有字段名称键的表实现。参考表单 table.field 可用于 table[“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 — 将名称设置为“Jane Doe”

表格