31

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

table.insert(t, i)

t[#t+1] = i

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

4

4 回答 4

40

使用哪个是偏好和环境问题:由于#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 值之间的 nil 值),那么 #t 可以是直接在 nil 值之前的任何索引(也就是说,它可以将任何这样的 nil 值视为结束的数组)。

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

于 2011-05-24T15:36:37.593 回答
6

以下内容略显有趣,但可能带有一丝美感。即使有明显的原因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
于 2011-05-31T19:18:07.660 回答
1

insert可以任意插入(如其名称所述),它仅默认为#t + 1,其中 ast[#t + 1] = i将始终附加到表的(末尾)。请参阅lua 手册中的第 5.5 节。

于 2011-05-24T15:32:18.123 回答
0

'#' 运算符仅使用索引键表。

t = {1, 2 ,3 ,4, 5, x=1, y=2}

在上面的代码

print(#t)  --> print 5 not 7

'#' 运算符在不使用时。

如果要'#' 运算符,则检查它以表元素类型。

插入函数可以使用任何类型。但是元素计数比'#'慢

于 2016-08-02T12:02:02.587 回答