【问题标题】:What's the difference between table.insert(t, i) and t[#t+1] = i?table.insert(t, i) 和 t[#t+1] = i 有什么区别?
【发布时间】:2011-09-01 01:07:09
【问题描述】:

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

table.insert(t, i)

t[#t+1] = i

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

【问题讨论】:

    标签: lua lua-table


    【解决方案1】:

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

    【讨论】:

    • 我知道插入可以接受额外参数的事实。我的问题是为什么我会使用两个参数版本而不是 t[#t + 1] = i
    • @Eric: 如果你的变量不是命名为 t,而是 myVeryDescriptiveLongNameOfMyGloballyVisibleArray 那么它会节省击键:-)
    • (function(t) t[#t+1] = i end)(myVeryDescriptiveLongNameOfMyGloballyVisibleArray)
    【解决方案2】:

    使用哪个取决于偏好和环境:由于在 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 通常就足够了)。

    【讨论】:

    • 我对 Lua 5.3 的建议是添加向量数组构造运算符 [ ],就像混合数组构造运算符 { } 一样。这个新的运算符将在内部具有maxnsize 字段,其中maxn 可以通过# 长度运算符和size 通过array.size(t)t:size() 访问。
    • @happy_marmoset:如果您需要这种行为,您可以使用 5.2 中已经存在的内容来实现它(只需设置一个添加这些属性的元表)。
    【解决方案3】:

    以下内容略显有趣,但可能带有一丝美感。尽管 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
    

    【讨论】:

    • 对不起,但这对我来说不是那么明显。是性能考虑吗?还是向后兼容?
    【解决方案4】:

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

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

    在上面的代码

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

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

    如果你想要'#'操作符,那么检查它到表格元素类型。

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

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 2015-03-21
      • 2012-03-10
      • 2017-08-20
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多