【问题标题】:Lua multidimensional array __index metatable errorLua多维数组__index元表错误
【发布时间】:2016-11-21 11:23:41
【问题描述】:

我正在尝试制作动态多维数组,但我在理解元表的工作方式时遇到了问题。就好像它有错误,它不知道如何获取设置一个值。这是一个例子:

function test(A)
  local G = {}
  local mt = {} 
  mt.__index = function(self, i)
    self[i] = setmetatable({}, mt)
    return self[i]
  end

  setmetatable(G, mt)

  G[1] = 10 -- adds 10
  G[1][2][3] = 10 -- error, why?breaks on G[1]

  --but when i do it like this
  G[1][2][3] = 10 -- adds 10
  G[1] = 10 -- erases whole table and adds 10   
  print(G[1][2][3]) -- error  
end

【问题讨论】:

  • G[1][2][3] = 10G[1] = 10 如何在G 中同时共存? print(G[1][2][3], G[1])应该显示什么?
  • 你是对的!我现在正在尝试使用“__newindex”在 G[1] 中放置一个表,以便它可以继续......失败了!
  • 对不起,我不明白你想达到什么目的。值 111 是否应该在以下代码中被覆盖:G[1]=111; G[1][2][3]=222?
  • 我试图多。矩阵并通过消除获得值...我有这个问题,我想了解,探索并使一切动态化...非常感谢,我现在明白为什么它不起作用了。

标签: multidimensional-array lua


【解决方案1】:

您将G[1] 设置为1010 不是表,所以G[1][2][3] 不可能工作。

仅供参考,__index 仅在 key 指向 nil 时被调用。如果G[1] == 10,则G[1][2] 不能调用__index


我怀疑您认为 G[1][2][3]G[1] 是两个完全独立的实体。他们不是。当你写:

G[1][2][3] = 42

...解析为:

((G[1])[2])[3] = 42

换句话说,在表G中,您访问索引1,然后在该表中,您访问索引2,然后在该表中,您分配给索引3。

这样会更清楚吗?

【讨论】:

  • 我添加 "mt.__newindex = function(self, i, v) local m = {v} rawset(self, i, m) end" 然后 G[1] = "10" 通过, print(G[1][1]) 打印“10”,G[1][2][3] = 10 错误,在 G[1][2] 处中断。发生了什么事?
  • 如果你想要的只是一个动态的多维表,那么你原来的 __index 元方法应该可以在没有 __newindex 的情况下正常工作,所以我仍然不确定你期望 Lua 的行为是什么是。当您指出错误时,您还应该告诉我们您期望它的行为方式。 (这就是 Egor 的 cmets 试图达到的目标。)
  • 我试图多。矩阵并通过消除获得值,我想完全延迟。非常感谢,您的回答对我帮助很大!
【解决方案2】:

G[1][2][3] = 10 -- 错误,为什么?在 G[1] 上中断

G[1][2] 上的中断,因为 G[1] 是数字,而不是表格。 试试代理表:http://www.lua.org/pil/13.4.4.html __index 是后备。

【讨论】:

    猜你喜欢
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2014-09-08
    相关资源
    最近更新 更多