在Lua中,似乎有两种方法可以将元素附加到数组中:
table.insert(t, i)
和
t[#t+1] = i
我应该使用哪种,为什么?
答案 0 :(得分:38)
使用哪个是首选项和环境问题:由于版本5.1中引入了#
长度运算符,t[#t+1] = i
在Lua 5.0中不起作用,而table.insert
已存在从5.0开始,两者都有效。另一方面,t[#t+1] = i
仅使用语言级别的运算符,而table.insert
涉及一个函数(它具有少量的查询和调用开销,并且依赖于table
模块。环境)。
在Programming in Lua的第二版(面向Lua 5.0的第一版的更新)中,Roberto Ierusalimschy(Lua的设计者)表示他更喜欢t[#t+1] = i
,因为它更加明显。 / p>
此外,根据您的使用案例,答案可能是“两个”。见the manual entry on the behavior of the length operator:
如果数组有“空洞”(即其他非零值之间的nil值),那么#t可以是直接在nil值之前的任何索引(也就是说,它可以考虑任何这样的nil值)作为数组的结尾)。
因此,如果您正在处理带有孔的数组,则使用其中任何一个(table.insert
uses the length operator)可能会将您的值“追加”到数组中低于您想要的索引。在这种情况下如何定义数组的大小取决于您,并且再次取决于偏好和环境:您可以使用table.maxn
(在5.2中消失但写得很简单),您可以保留{n
1}}表中的字段并在必要时更新它,你可以将表包装在metatable中,或者你可以使用另一种更适合你情况的解决方案(在一个循环中,一个local tsize
在范围之外的范围内循环通常就足够了。)
答案 1 :(得分:7)
以下是有趣的一面,但可能带有一丝美学。尽管有明显的原因mytable:operation()
没有像mystring:operation()
那样提供,但可以轻松推出自己的变体,并在需要时获得第三种符号。
Table = {}
Table.__index = table
function Table.new()
local t = {}
setmetatable(t, Table)
return t
end
mytable = Table.new()
mytable:insert('Hello')
mytable:insert('World')
for _, s in ipairs(mytable) do
print(s)
end
答案 2 :(得分:1)
insert
可以任意插入(如其名称所示),它只默认为#t + 1
,其中t[#t + 1] = i
将始终附加到(表的末尾)。见the lua manual中的第5.5节。
答案 3 :(得分:0)
'#'运算符仅使用索引键表。
t = {1, 2 ,3 ,4, 5, x=1, y=2}
上面的代码
print(#t) --> print 5 not 7
'#'操作员何时不使用。
如果你想'#'运算符,然后检查表元素类型。
插入功能可以使用任何类型的使用。但是元素计数比#&#39; <&#39;
慢