在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
在循环外部的范围内通常就足够了).
以下是有趣的一面,但可能具有一丝美学.即使有明显的原因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)