lua - ¿Por qué es ''name'' nil para debug.getinfo(1)
lua-5.1 (1)
Esta es una limitación de la heurística utilizada por Lua para proporcionar nombres para las funciones.
En Lua, todas las funciones son anónimas. Una función dada puede ser el valor de varias variables: campos globales, locales y de tabla. El sistema de depuración de Lua intenta encontrar un nombre razonable para un valor en función de su origen al examinar el bytecode que se está ejecutando.
Considere el ejemplo más simple
blah()
pcall(blah)
En la primera llamada, el sistema de depuración ve que la función que se está llamando proviene del blah
y debug.getinfo(1).name
da el resultado esperado, blah
.
En la segunda llamada, el sistema de depuración ve que la función que se llama procede del primer argumento para pcall
pero no mira más allá para ver de dónde vino ese argumento, y debug.getinfo(1).name
da nil
.
Lo mismo sucede cuando llamas _G[name]()
. Todo lo que ve el sistema de depuración es un campo de una tabla y el nombre del campo está demasiado lejos.
Intente agregar print(debug.traceback())
como la primera línea de blah
para ver otra explicación de esta explicación.
Intento armar un marco de prueba de lua que te permita conocer la función que tuvo el problema, pero cuando cambié de la cadena de carga a _G
, ( _G
para que mi arnés de prueba pudiera ver los resultados de la llamada de función) mis funciones comenzaron usando ''nil'' para el nombre de la función
¿Por qué _G
no puede detectar el nombre de la función actual en el siguiente código? Además, ¿cómo puedo obtener los resultados de devolución de la cadena de carga (es decir, el ''falso'' de la llamada bla) o establecer el nombre de la función cuando se utiliza _G
(es decir, decirle al intérprete lua cuál debería ser el nombre de la función)?
function run_test(one, two)
if one ~= two then
print(debug.getinfo(2).name..'' Failed'')
end
end
function blah()
run_test(false, true)
return false
end
local fname = ''blah''
local status, result = pcall(_G[fname]) -- Outputs ''nil''; result is ''false''
local status, result = pcall(loadstring(fname..''()'')) -- Outputs ''blah'', result is ''nil''
Lo principal que necesito es una forma de llamar a una función usando una cadena del nombre de la función, poder ver el nombre de la función dentro de la llamada (para las fallas de la prueba apuntar a la función que falló, como fname = ''blah'' en el código anterior) y poder obtener el valor de retorno
local fname = ''blah''
status, result = pcall(??Call fname somehow??)
assert(status)
assert(not result)
--stdout should be "blah Failed"