как узнать все свойства объекта в Lua?

есть ли способ получить все ненулевые параметры / свойства объекта? Я нашел это: getmetadata(self.xxxx) и я ищу что-то вроде: getalldata(self).

в настоящее время я работаю над проектом, в котором участвует lua. К сожалению, нет полной ссылки, и я должен использовать предварительно скомпилированный материал.

Я надеюсь, что вы в состоянии понять, что я пытаюсь сказать.

3 ответов


Я собираюсь предположить, что когда вы ссылаетесь на "объекты", Вы имеете в виду " таблицы lua с __index metatable указывая на другие таблицы". Если это не так, этот ответ вам не поможет.

если ваша структура объекта выполнена с таблицами (это все __indexes являются таблицами), то вы можете "разобрать их", чтобы получить все свойства и унаследованные свойства.

если у вас есть какие-либо функции __index тогда то, что вы просите, невозможно; нет способа получить "список значений, для которых функция возвращает значение, отличное от нуля".

в первом случае, код будет выглядеть так:

function getAllData(t, prevData)
  -- if prevData == nil, start empty, otherwise start with prevData
  local data = prevData or {}

  -- copy all the attributes from t
  for k,v in pairs(t) do
    data[k] = data[k] or v
  end

  -- get t's metatable, or exit if not existing
  local mt = getmetatable(t)
  if type(mt)~='table' then return data end

  -- get the __index from mt, or exit if not table
  local index = mt.__index
  if type(index)~='table' then return data end

  -- include the data from index into data, recursively, and return
  return getAllData(index, data)
end

но помните, если любой из ваших __indexes-это функция, нет способа получить все свойства; по крайней мере, не от Lua.


Я написал свой собственный код 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

это противоположный подход, а затем сообщение перед использованием. Просмотрите все пары значений ключей в таблице. Если значение одного индекса является таблицей, просмотрите эту таблицу. Это решение не получит вверх metatables, как другой пост сделал


Я считаю, что объекты-это просто таблица, поэтому вы должны иметь возможность перебирать свойства, как и любая другая таблица:

for i,v in ipairs(your_object) do body end