基本用法
基本表用法包括訪問和分配表元素,新增表內容以及刪除表內容。這些示例假設你知道如何建立表。
訪問元素
鑑於下表,
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()
從表的剩餘未洗滌部分中隨機提取一個元素。