【问题标题】:Lua table.getn() returns 0?Lua table.getn() 返回 0?
【发布时间】:2012-03-25 16:19:10
【问题描述】:

我已将 Lua 嵌入到我的 C 应用程序中,并试图通过以下方式找出为什么在我的 C 代码中创建表:

lua_createtable(L, 0, numObjects);

并返回 Lua,当我调用以下命令时将产生零结果:

print("Num entries", table.getn(data))

(其中“data”是上面lua_createtable创建的表)

表格中有明显的数据,因为我可以通过以下方式遍历每个条目(字符串:用户数据)对:

for key, val in pairs(data) do
  ...
end

但是为什么 table.getn(data) 返回零?当我使用 lua_createtable 创建表时,是否需要在表的元中插入一些东西?我一直在查看 lua_createtable 使用的示例,但我还没有在任何地方看到这样做......

【问题讨论】:

    标签: c lua


    【解决方案1】:

    table.getn(你不应该在 Lua 5.1+ 中使用它。使用长度运算符 #)返回表的 array 部分中的元素数。

    数组部分是从数字 1 开始并增加直到第一个值 nil(不存在)的每个键。如果你所有的键都是字符串,那么你的表的数组部分的大小是 0。

    【讨论】:

    • 那么就没有简单的方法来做我想做的事吗? -- 在不直接迭代的情况下获取表中元素的数量(读取对)?
    • 您可以手动跟踪表大小,只要您对表进行更改并重载__len 元方法以使运算符# 返回该值。当然,这种方法需要大量的编码规则——忘记更新表大小值,你就完蛋了。
    • 说“使用长度运算符#”而不举一个例子是不礼貌的。这个答案的意思是,“要获取数组 A 的长度,请键入 #A”。这可能看起来微不足道,但它会让很多人失望并引起怀疑,因为在您测试并熟悉它之前,您不能假设操作员的行为方式与您认为的方式相同。尽管如此,还是投了赞成票。
    【解决方案2】:

    虽然它的成本很高(简单列表的 O(n) 与 O(1)),但您也可以添加一个方法来计算地图的元素:

    >> function table.map_length(t)
        local c = 0
        for k,v in pairs(t) do
             c = c+1
        end
        return c
    end
    
    >> a = {spam="data1",egg='data2'}
    >> table.map_length(a)
    2
    

    如果您有这样的要求,并且您的环境允许您这样做,请考虑使用提供that kind of featurespenlight 等等。

    【讨论】:

      【解决方案3】:

      # 运算符(和 table.getn)有效地返回数组部分的大小(尽管当你有一个多孔表时,语义更复杂)

      它不计算表的哈希部分中的任何内容(例如,字符串键)

      【讨论】:

        【解决方案4】:
        for k,v in pairs(tbl) do count = count + 1 end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-02
          • 1970-01-01
          • 2015-06-26
          • 2015-06-15
          • 2012-03-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多