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

Eri*_*ric 28 lua lua-table

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

table.insert(t, i)
Run Code Online (Sandbox Code Playgroud)

t[#t+1] = i
Run Code Online (Sandbox Code Playgroud)

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

Stu*_*ley 39

使用哪个是优先级和环境问题:因为#版本5.1中引入了长度运算符,t[#t+1] = i所以在Lua 5.0中不起作用,而table.insert自5.0以来一直存在并且将在两者中都有效.另一方面,仅t[#t+1] = i使用语言级别的运算符,而是table.insert涉及一个函数(它具有少量的查询和调用开销,并且取决于table环境中的模块).

Lua编程的第二版(面向Lua 5.0的第一版的更新)中,Roberto Ierusalimschy(Lua的设计者)表示他更喜欢t[#t+1] = i,因为它更加明显.


此外,根据您的使用情况,答案可能是"两个".请参阅有关长度运算符行为的手册条目:

如果数组具有"空洞"(即,其他非零值之间的nil值),那么#t可以是直接在nil值之前的任何索引(也就是说,它可以将任何这样的nil值视为结束的数组).

因此,如果您正在处理带有孔的数组,则使用任何一个(table.insert使用长度运算符)可能会将值"追加"到数组中比您想要的更低的索引.在这种情况下如何定义数组的大小取决于您,并且再次取决于偏好和环境:您可以使用table.maxn(在5.2中消失但是写n得很简单),您可以在表中保留一个字段并更新它必要时,您可以将表包装在metatable中,或者您可以使用另一种更适合您情况的解决方案(在循环中,local tsize在循环外部的范围内通常就足够了).


And*_*rsH 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
Run Code Online (Sandbox Code Playgroud)

  • 对不起,但对我来说不是那么明显。这是性能方面的考虑吗?还是向后兼容? (2认同)