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

在 Lua 中,似乎有两种将元素添加到数组中的方法:

table.insert(t, i)

t[#t+1] = i

我应该使用哪一种,为什么呢?

原文链接 https://stackoverflow.com/questions/6112710

点赞
stackoverflow用户255049
stackoverflow用户255049

insert 可以在任意位置插入元素(顾名思义),但默认位置为 #t + 1,而 t[#t + 1] = i 则总是将元素附加到表(末尾)。参见 the lua manual 的第 5.5 节。

2011-05-24 15:32:18
stackoverflow用户34799
stackoverflow用户34799

使用哪个取决于个人喜好和情况:由于 # 长度运算符是在版本 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 导向的第一版的更新)中,Lua 设计者 Roberto Ierusalimschy 表示他更喜欢 t[#t+1] = i,因为它更加可见。

此外,根据您的使用情况,答案可能是“都不是”。请参阅长度运算符的行为的手册条目

如果数组中有“空洞”(也就是在其他非空值之间的 nil 值),那么 #t 可以是任何一个直接前置 nil 值的索引(也就是说,它可能将任何这样的 nil 值视为数组的末尾)。

因此,如果您处理带有空洞的数组,则使用其中之一(table.insert 使用长度运算符)可能会将您的值附加到数组中比您想要的更低的索引。在这种情况下,如何定义数组的大小取决于您的喜好和情况:您可以使用 table.maxn(在 5.2 中消失但易于编写),您可以在表中保留一个 n 字段,并在必要时更新它,您可以将表包装在元表中,或者您可以使用更适合您情况的其他解决方案(在循环中,立即在循环外部作用域中使用 local tsize 通常就足够了)。

2011-05-24 15:36:37
stackoverflow用户354668
stackoverflow用户354668

下面的内容有点有趣,但可能会涉及到一些审美的问题。虽然 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-31 19:18:07
stackoverflow用户4988149
stackoverflow用户4988149

# 运算符只能用于索引键表。

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

在上述代码中,

print(#t)  --> 输出 5 而不是 7

# 运算符并不总是实用的。

如果你要使用 # 运算符,那么你需要检查表元素的类型。

insert 函数可以使用任何类型,但元素数量较多时速度变慢,而 # 运算符更为快速。

2016-08-02 12:02:02