【发布时间】:2011-09-01 01:07:09
【问题描述】:
在 Lua 中,似乎有两种方法可以将元素附加到数组中:
table.insert(t, i)
和
t[#t+1] = i
我应该使用哪个,为什么?
【问题讨论】:
在 Lua 中,似乎有两种方法可以将元素附加到数组中:
table.insert(t, i)
和
t[#t+1] = i
我应该使用哪个,为什么?
【问题讨论】:
insert 可以任意插入(如其名称所示),它仅默认为#t + 1,其中t[#t + 1] = i 将始终附加到表的(末尾)。请参阅the lua manual 中的第 5.5 节。
【讨论】:
t[#t + 1] = i
(function(t) t[#t+1] = i end)(myVeryDescriptiveLongNameOfMyGloballyVisibleArray)
使用哪个取决于偏好和环境:由于在 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,因为它更显眼。
此外,根据您的用例,答案可能是“都不是”。见the manual entry on the behavior of the length operator:
如果数组有“洞”(即其他非 nil 值之间的 nil 值),那么 #t 可以是直接在 nil 值之前的任何索引(也就是说,它可以考虑任何这样的 nil 值作为数组的结尾)。
因此,如果您正在处理一个有孔的数组,使用其中一个 (table.insert uses the length operator) 可能会将您的值“附加”到数组中比您想要的更低的索引。在这种情况下如何定义数组的大小取决于您,并且再次取决于偏好和环境:您可以使用 table.maxn(在 5.2 中消失但编写起来很简单),您可以保留一个 n 字段在表格中并在必要时对其进行更新,您可以将表格包装在元表中,或者您可以使用更适合您的情况的另一种解决方案(在循环中,循环外的范围内的local tsize 通常就足够了)。
【讨论】:
maxn 和size 字段,其中maxn 可以通过# 长度运算符和size 通过array.size(t) 或t:size() 访问。
以下内容略显有趣,但可能带有一丝美感。尽管 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
【讨论】:
'#' 运算符只使用索引键表。
t = {1, 2 ,3 ,4, 5, x=1, y=2}
在上面的代码
print(#t) --> print 5 not 7
'#' 运算符在不使用时。
如果你想要'#'操作符,那么检查它到表格元素类型。
插入函数可以使用任何类型。但是元素计数比'#'慢
【讨论】: