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