Lua 表可用于创建任何抽象数据结构,在您的情况下,您表示您需要一个“列表”。 Lua 表是一种数据结构,它结合了基于数字索引的访问和键:值访问。
根据您的示例,您正在使用表的数字索引功能,可让您迭代(使用 ipairs())这些值。您将无法将 nil 放入表中,因为数字索引在第一个 nil 条目处停止。表中剩余的值存储为键值对。
有几种解决方法,但这取决于您为什么要在列表中使用 nil。最简单的方法是使用字符串“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”进行比较与与本机类型 nil 进行比较没有性能损失。
数组中的“空洞”问题(由 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
请注意,即使存在“nil”,table.pack 函数也会创建一个包含正确数量的项目的字段“n”。有关完整说明,请参阅 PIL 第 6.2 章,可变函数。