statements statement language for define ciclo lua introspection

statement - Imprimir todas las variables locales accesibles para el alcance actual en Lua



repeat in lua (5)

Aquí hay una implementación de una función locals() . Devolverá una tabla de locales del ámbito de llamada:

function locals() local variables = {} local idx = 1 while true do local ln, lv = debug.getlocal(2, idx) if ln ~= nil then variables[ln] = lv else break end idx = 1 + idx end return variables end

Tenga en cuenta que en lua REPL, cada línea es un trozo separado con locales independientes. Además, se devuelven las variables internas (los nombres comienzan con ''('' si desea eliminarlos):

> local a = 2; for x, v in pairs(locals()) do print(x, v) end a 2 (*temporary) function: 0x10359b38

Gracias por aceptar. ¡Has desbloqueado la última pieza del rompecabezas! ;-)

Los valores ascendentes son variables locales de ámbitos externos, que se utilizan en la función actual. No están en _G ni en locals()

function upvalues() local variables = {} local idx = 1 local func = debug.getinfo(2, "f").func while true do local ln, lv = debug.getupvalue(func, idx) if ln ~= nil then variables[ln] = lv else break end idx = 1 + idx end return variables end

Ejemplo (observe que debe usar una para que se muestre):

> local a= 2; function f() local b = a; for x,v in pairs(upvalues()) do print(x,v) end end; f() a 2

Sé cómo imprimir "todas" las variables globales usando el siguiente código

for k,v in pairs(_G) do print("Global key", k, "value", v) end

Entonces mi pregunta es cómo hacer eso para todas las variables que son accesibles desde la función que se está ejecutando actualmente, algo que puede hacer lo que locals() hace por Python.


El problema con la versión anterior del bucle del juez Maygarden es simplemente local i = 0 . No hace nada porque el primero indexado con ''0'' siempre devolverá nil.

Recuerde que los índices Lua por defecto comienzan con ''1'', no ''0'' como C / C ++. Puede usar ''0'' para un índice con sus propios tipos de curso, pero las funciones predeterminadas esperan el valor predeterminado de ''1'' como primer índice.

Simplemente cámbialo a local i = 1 y su ciclo funcionará bien.


Puede usar getfenv para obtener un entorno local.

getfenv ([f]) Devuelve el entorno actual en uso por la función. f puede ser una función Lua o un número que especifica la función en ese nivel de pila: el nivel 1 es la función que llama a getfenv. Si la función dada no es una función Lua, o si f es 0, getfenv devuelve el entorno global. El valor predeterminado para f es 1.

Editar: lo siento, estaba equivocado.

Acabo de comprobar el código fuente de Lua. debug.getlocal() es la única forma de obtener las variables locales.
Lua usa una estructura Proto interna y no nos da acceso a eso.
(Proto posee propiedades locales más una referencia Proto padre. Proto de la función de iteración, mediante el uso de getfenv,
también iteramos propiedades heredadas, no lo que queríamos)

Los usuarios pueden definir sus protocolos ya sea con entornos y las funciones set/getfenv o mediante metatablas.


Utilice debug.getlocal .


Ver debug.getlocal :

local foobar = 1 local i = 0 repeat local k, v = debug.getlocal(1, i) if k then print(k, v) i = i + 1 end until nil == k

Salida:

foobar 1 i 2