Lua表可以用來創建任何抽象數據結構,在你的情況下,你表明你想要一個「列表」。 Lua表是一種數據結構,它將基於數字索引的訪問與鍵值訪問相結合。
根據您的示例,您使用的表格的數字索引功能允許您通過這些值進行迭代(使用ipairs())。由於數字索引在第一個零輸入處停止,因此不能將零放入表中。表中剩餘的值存儲爲鍵:值對。
有幾種解決方法,但它取決於你爲什麼要在列表中爲零。最簡單的方法是使用字符串「nil」而不是本地數據類型nil。
a = {1, 2, 3, "nil", 4}
for k,v in ipairs(a) do
print(k,v)
end
這段代碼的結果是:
1 1
2 2
3 3
4 nil
5 4
的服務,因爲lua實現字符串的方式,沒有比較字符串「無」的性能損失相對比較原生型零。
數組中的「空洞」(由nil引起)的問題在Lua的第5章表格中進行了討論。 Roberto Ierusalimschy的建議是跟蹤陣列的大小以避免漏洞問題。
以下代碼顯示了一個面向對象的方法來跟蹤列表的大小。這個主題有很多可能的變化。
function makeList(...)
local list = table.pack(...)
list.length =
function(self) return self.n
end
list.append =
function(self, value)
self.n = self.n + 1
self[self.n] = value
end
list.print =
function(self)
for i = 1, self.n do print(i, self[i]) end
end
return list
end
a = makeList(1, 2, 3, nil, 4)
a:append(5)
a:print()
print(a:length())
結果是:
1 1
2 2
3 3
4 nil
5 4
6 5
6
注意函數table.pack創建包含項目的正確的號碼,即使「零」是存在的字段「N」。有關完整的解釋,請參見PIL第6.2章「變量函數」。
我接受這個答案,因爲它使用本地表和本地ipairs,使用起來非常簡單,而且也很好地處理了真值測試。 – nagylzs