2011-04-12 17 views
7

¿Hay alguna forma de obtener todos los parámetros/propiedades no nulos de un objeto? Encontré esto: getmetadata(self.xxxx) y estoy buscando algo como: getalldata(self).cómo averiguar todas las propiedades de un objeto en lua?

Actualmente estoy trabajando en un proyecto en el que lua está involucrado. Lamentablemente, no hay una referencia completa y tengo que usar material precompilado.

Espero que entiendan lo que estoy tratando de decir.

Respuesta

8

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.

0

que creen objetos son sólo una mesa, por lo que debe ser capaz de repetir las propiedades como cualquier otra tabla:

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

esto solo le da "propiedades" de clave numérica. Creo que querías 'pares' en lugar de' ipairs'. – Jakob

+0

Sí, que es lo que egarcia incluye en su solución más completa. Gracias por señalar este error. – BMitch

1

escribir mi propio código PrintObject .. aquí está

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 

Este es el enfoque opuesto, entonces el cargo antes utilizado. Revise todos los pares de valores clave en la tabla. Si el valor de un índice es una tabla, revise esta tabla. Esta solución no obtendrá los metadatos hacia arriba como la otra publicación hizo

+0

Este es un código útil para la depuración. –

Cuestiones relacionadas