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 "进行比较不会导致性能损失。
在《Lua编程》第5章表中讨论了“空洞”(由nil引起)的问题。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',即使'nil'存在也是如此。请参阅《PIL》第6.2章“可变参数函数”进行完整解释。