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

| 在Lua中,似乎有两种将元素追加到数组的方法:
table.insert(t, i)
t[#t+1] = i
我应该使用哪个?为什么?     
已邀请:
使用哪个优先级和情况有关:由于5.1版中引入了
#
长度运算符,因此
t[#t+1] = i
在Lua 5.0中将不起作用,而ѭ4since从5.0开始就已经存在并且将在两者中均有效。另一方面,
t[#t+1] = i
仅使用语言级别的运算符,,4ѭ涉及一个函数(查找和调用的开销很小,并且取决于环境中的
table
模块)。 在Lua编程的第二版(面向Lua 5.0的第一版的更新)中,Roberto Ierusalimschy(Lua的设计师)指出,他更喜欢
t[#t+1] = i
,因为它更为明显。 另外,根据您的用例,答案可能是“都不”。有关长度运算符的行为,请参见手册条目:   如果数组具有\“ holes \”(即其他非nil值之间的nil值),则#t可以是直接在nil值之前的任何索引(也就是说,它可以将任何此类nil值视为数组的末尾)。 因此,如果要处理带孔的数组,则使用其中一个(
table.insert
使用长度运算符)可能会将您的值“追加”到数组中比所需的索引低的位置。在这种情况下,如何定义数组的大小取决于您自己,并且再次取决于首选项和情况:您可以使用
table.maxn
(在5.2中消失,但编写起来很简单),可以在表中保留
n
字段,必要时进行更新,可以将表包装在一个元表中,或者可以使用其他更适合您情况的解决方案(在循环中,循环外部的作用域中的
local tsize
通常就足够了)。     
以下是一些有趣的方面,但可能带有一些美学意义。即使很明显地没有提供像ѭ14那样的
mytable: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
    
insert
可以任意插入(如其名称所示),它仅默认为
#t + 1
,因为
t[#t + 1] = i
始终会附加到表的(末尾)。参见lua手册中的5.5节。     
\'#\'运算符仅使用索引键表。
t = {1, 2 ,3 ,4, 5, x=1, y=2}
在上面的代码
print(#t)  --> print 5 not 7
\'#\'运算符不使用时。 如果要使用\'#\'运算符,则将其检查为表元素类型。 插入函数可以使用任何类型使用。但是元素计数比\'#\'慢     

要回复问题请先登录注册