基本用法
基本表用法包括访问和分配表元素,添加表内容以及删除表内容。这些示例假设你知道如何创建表。
访问元素
鉴于下表,
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()
从表的剩余未洗涤部分中随机提取一个元素。