基本用法

基本表用法包括訪問和分配表元素,新增表內容以及刪除表內容。這些示例假設你知道如何建立表。

訪問元素

鑑於下表,

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() 從表的剩餘未洗滌部分中隨機提取一個元素。