基本用法

基本表用法包括访问和分配表元素,添加表内容以及删除表内容。这些示例假设你知道如何创建表。

访问元素

鉴于下表,

local example_table = {"Nausea", "Heartburn", "Indigestion", "Upset Stomach",
                       "Diarrhea", cure = "Pepto Bismol"}

可以使用索引语法索引表的顺序部分,索引语法的参数是所需键值对的键。正如创建教程中所解释的,大多数声明语法都是用于声明键值对的语法糖。顺序包含的元素,如 example_table 中的前五个值,使用递增的整数值作为键; 记录语法使用字段名称作为字符串。

print(example_table[2])        --> Heartburn
print(example_table["cure"])   --> Pepto Bismol

对于字符串键,有一些语法糖可以与表创建中的字符串键的记录样式语法并行。以下两行是等效的。

print(example_table.cure)      --> Pepto Bismol
print(example_table["cure"])   --> Pepto Bismol

你可以使用之前未使用的密钥访问表,这不是其他语言中的错误。这样做会返回默认值 nil

分配元素

你可以通过使用索引语法分配表来修改现有表元素。此外,记录样式索引语法也可用于设置值

example_table.cure = "Lots of water, the toilet, and time"
print(example_table.cure)    --> Lots of water, the toilet, and time

example_table[2] = "Constipation"
print(example_table[2])      --> Constipation

你还可以使用赋值将新元素添加到现有表中。

example_table.copyright_holder = "Procter & Gamble"
example_table[100] = "Emergency source of water"

特别注意: 记录语法不支持某些字符串。有关详细信息,请参阅备注部分。

删除元素

如前所述,没有指定值的键的默认值是 nil。从表中删除元素就像将键的值重置为默认值一样简单。

example_table[100] = "Face Mask"

这些元素现在与未设置元素无法区分。

表长

表只是关联数组(参见备注),但是当从 1 开始使用连续的整数键时,表称具有序列

使用 # 查找表的序列部分的长度:

local example_table = {'a', 'l', 'p', 'h', 'a', 'b', 'e', 't'}
print(#example_table)    --> 8

你可以使用长度操作轻松地将项目附加到序列表。

example_table[#example_table+1] = 'a'
print(#example_table)    --> 9

在上面的例子中,#example_table 的先前值是 8,添加 1 会给你序列中的下一个有效整数键 9,所以… example_table[9] = 'a'。这适用于任何长度的表。

特别注意: 使用不连续的整数键并从 1 开始会破坏使表成为稀疏表的序列。在这种情况下,长度操作的结果是不确定的。请参阅备注部分。

使用表库函数添加/删除元素

向表中添加元素的另一种方法是 table.insert() 函数。insert 函数仅适用于序列表。调用该函数有两种方法。第一个示例显示了第一个用法,其中一个指定了插入元素的索引(第二个参数)。这会将给定索引中的所有元素推送到 #table 一个位置。第二个示例显示了 table.insert() 的其他用法,其中未指定索引,并且给定值附加到表的末尾(索引 #table + 1)。

local t = {"a", "b", "d", "e"}
table.insert(t, 3, "c")        --> t = {"a", "b", "c", "d", "e"}

t = {"a", "b", "c", "d"}
table.insert(t, "e")           --> t = {"a", "b", "c", "d", "e"}

平行 table.insert() 去除元素是 table.remove()。类似地,它有两个调用语义:一个用于删除给定位置的元素,另一个用于从序列的末尾删除。从序列中间删除时,所有后续元素都向下移动一个索引。

local t = {"a", "b", "c", "d", "e"}
local r = table.remove(t, 3)       --> t = {"a", "b", "d", "e"}, r = "c"

t = {"a", "b", "c", "d", "e"}
r = table.remove(t)                --> t = {"a", "b", "c", "d"}, r = "e"

这两个函数改变了给定的表。正如你可能能够告诉第二种调用 table.insert() 的方法,table.remove() 为表提供了堆栈语义。利用它,你可以编写类似下面示例的代码。

function shuffle(t)
    for i = 0, #t-1 do
        table.insert(t, table.remove(t, math.random(#t-i)))
    end
end

它实现了 Fisher-Yates Shuffle,可能效率低下。它使用 table.insert() 将随机提取的元素附加到同一个表的末尾,并使用 table.remove() 从表的剩余未洗涤部分中随机提取一个元素。