Voy a asumir que cuando se refiera a "objetos" que significan "tablas lua con un metatabla __index
apuntando a otras tablas". Si ese no es el caso, esta respuesta no te ayudará.
Si su estructura de objeto está hecha con tablas (esto es, todas __indexes
son tablas) entonces puede "analizarlas" para obtener todas las propiedades y propiedades heredadas.
Si tiene alguna función como __index
, entonces lo que usted pregunta es imposible; no hay forma de obtener la "lista de valores para los cuales una función devuelve un valor no nulo".
En el primer caso, el código se vería así:
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
Pero recuerda, si alguno de sus __index
ES es una función, no hay manera de conseguir todas las propiedades; al menos no de Lua.
esto solo le da "propiedades" de clave numérica. Creo que querías 'pares' en lugar de' ipairs'. – Jakob
Sí, que es lo que egarcia incluye en su solución más completa. Gracias por señalar este error. – BMitch