如何在Lua中查找一个对象的所有属性?

有没有一种方法可以获取对象的所有非 nil 参数/属性?我找到了这个:getmetadata(self.xxxx),我正在寻找这样的东西:getalldata(self)

我目前正在处理涉及 Lua 的项目。不幸的是,没有完整的参考资料,我必须使用预编译的东西。

我希望你能理解我想说什么。

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

点赞
stackoverflow用户596285
stackoverflow用户596285

我认为对象只是一个表格,因此您应该可以像遍历其他表格一样遍历属性:

for i,v in ipairs(your_object) do body end
2011-04-12 16:11:19
stackoverflow用户312586
stackoverflow用户312586

我假设你所说的“objects”指的是“带有一个指向其他表的__index元表的lua表”。如果不是这样,这个答案将无法帮助你。

如果你的对象结构是由表构成的(也就是说,所有的__index都是表),那么你可以“分解它们”来获取所有属性和继承属性。

如果你有任何函数作为__index,那么你要求的是不可能的;没有办法得到“某个函数返回非nil值的值列表”。

在第一种情况下,代码应该是这样的:

function getAllData(t, prevData)
  -- 如果prevData == nil,则开始为空,否则从prevData开始
  local data = prevData or {}

  -- 复制t的所有属性
  for k,v in pairs(t) do
    data[k] = data[k] or v
  end

  -- 获取t的元表,如果没有则退出
  local mt = getmetatable(t)
  if type(mt)~='table' then return data end

  -- 获取mt的__index,如果不是表则退出
  local index = mt.__index
  if type(index)~='table' then return data end

  -- 将索引中的数据递归地包含到data中,并返回
  return getAllData(index, data)
end

但是请记住,如果你的任何__index都是一个函数,就没有办法得到所有的属性;至少从Lua来说是这样的。

2011-04-12 18:08:32
stackoverflow用户3759231
stackoverflow用户3759231

我写了自己的 printObject 代码.. 在这里

以下是我的代码:

function printObj(obj, hierarchyLevel)
  if (hierarchyLevel == nil) then
    hierarchyLevel = 0
  elseif (hierarchyLevel == 4) then
    return 0
  end

  local whitespace = ""
  for i=0,hierarchyLevel,1 do
    whitespace = whitespace .. "-"
  end
  io.write(whitespace)

  print(obj)
  if (type(obj) == "table") then
    for k,v in pairs(obj) do
      io.write(whitespace .. "-")
      if (type(v) == "table") then
        printObj(v, hierarchyLevel+1)
      else
        print(v)
      end
    end
  else
    print(obj)
  end
end

这是与之前post使用的相反的方法。 遍历表中的所有键值对。如果一个索引的值是一个表,则需要遍历这个表。 这种解决方案不会像另一篇文章那样获取上游元表。

2015-04-27 11:53:27