Lua 什么';插入(t,i)和t[#t+;1]=i之间的区别是什么?

Lua 什么';插入(t,i)和t[#t+;1]=i之间的区别是什么?,lua,lua-table,Lua,Lua Table,在Lua中,似乎有两种方法可以将元素附加到数组中: table.insert(t, i) 及 我应该使用哪个,为什么?insert可以任意插入(如其名称所示),它只默认为#t+1,其中ast[#t+1]=I将始终附加到(表的末尾)。请参见中的第5.5节。使用哪一个取决于偏好和环境:由于长度操作符是在5.1版中引入的,t[#t+1]=i在LUA5.0中不起作用,而表.insert从5.0开始就存在,并且将在这两个版本中都起作用。另一方面,t[#t+1]=i使用专门的语言级运算符,wherasta

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

table.insert(t, i)


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

insert
可以任意插入(如其名称所示),它只默认为
#t+1
,其中as
t[#t+1]=I
将始终附加到(表的末尾)。请参见中的第5.5节。

使用哪一个取决于偏好和环境:由于
长度操作符是在5.1版中引入的,
t[#t+1]=i
在LUA5.0中不起作用,而
表.insert从5.0开始就存在,并且将在这两个版本中都起作用。另一方面,
t[#t+1]=i
使用专门的语言级运算符,wheras
table.insert
涉及一个函数(查找和调用的开销很小,取决于环境中的
table
模块)

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


此外,根据您的用例,答案可能是“两者都不是”。见:

如果数组有“空穴”(也就是在其他非零值之间的零值),那么γt可以是直接在一个零值之前的任何索引(也就是说,它可以考虑任何这样的零值作为数组的结尾)。


因此,如果您处理的是一个有洞的数组,那么使用其中一个()可能会将您的值“附加”到数组中比您想要的更低的索引中。在这种情况下,如何定义数组的大小取决于您自己,同样取决于偏好和环境:您可以使用
table.maxn
(在5.2中消失,但编写起来很简单),您可以在表中保留一个
n
字段,并在必要时对其进行更新,您可以将表包装到元表中,或者,您可以使用另一种更适合您的情况的解决方案(在循环中,循环外范围内的
本地tsize
通常就足够了)。

以下内容稍微有点有趣,但可能有一点美感。尽管有明显的原因表明没有像
mystring:operation()
那样提供
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
“#”运算符仅使用索引键表

t = {1, 2 ,3 ,4, 5, x=1, y=2}
以上代码

print(#t)  --> print 5 not 7
不使用时使用“#”运算符

如果要使用“#”运算符,请将其选中为表元素类型


Insert函数可以使用任何类型。但是元素计数的工作速度比“#”慢。

我知道Insert可以使用额外的参数。我的问题是,为什么我会在
t[#t+1]=I上使用两个参数版本?埃里克:如果您的变量没有命名为t,但myVeryDescriptiveLongNameOfMyGloballyVisibleArray,那么它会保存击键:-)
(函数(t)t[#t+1]=I end)(myVeryDescriptiveLongNameOfMyGloballyVisibleArray)
我对Lua5.3的建议是添加向量数组构造操作符[],就像混合数组构造操作符{}。这个新操作符将在内部具有
maxn
size
字段,其中
maxn
将通过
#
长度操作符和
size
通过
array.size(t)
t:size()
@happy\u marmoset进行访问:如果您需要这种行为,您可以用5.2中已经存在的东西实现它(只需设置一个添加这些属性的元表)。对不起,这对我来说并不明显。这是出于性能考虑还是向后兼容?
print(#t)  --> print 5 not 7