table.insert(t,i)和t [#t + 1] = i之间有什么区别?

时间:2011-05-24 15:14:14

标签: lua lua-table

在Lua中,似乎有两种方法可以将元素附加到数组中:

table.insert(t, i)

t[#t+1] = i

我应该使用哪种,为什么?

4 个答案:

答案 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;