Etwas wie folgt aus:In Lua, wie können Sie den Namen der aktuellen Funktion, wie der C99 __func__ Bezeichner drucken?
function foo()
print(__func__)
...
end
Wie es getan werden kann?
Etwas wie folgt aus:In Lua, wie können Sie den Namen der aktuellen Funktion, wie der C99 __func__ Bezeichner drucken?
function foo()
print(__func__)
...
end
Wie es getan werden kann?
#!/usr/bin/lua
local function myFunc()
print(debug.getinfo(1, "n").name);
end
myFunc()
Verwenden Sie die Debug Library. Es bietet eine getinfo(func)
Funktion, die eine Tabelle mit Informationen über die Funktion zurückgibt.
Sie können nicht. In lua sind Funktionen erste Klassenvariablen. Sie haben also keine Namen. Sie können auch fragen, "wie der Name von 2" ist. Nur weil eine Variable zugewiesen wurde, hat der Wert "2" für diese Variable nicht den Namen 2. Ebenso ist "someFunc" eine Variable - möglicherweise eine von vielen -, die eine bestimmte Funktion enthält.
Während ich mit Ephraim's answer zustimmen, wird dieser Code nicht immer melden den gleichen Namen wie Chris Becke hingewiesen. Wenn die Funktion einer anderen Variablen zugewiesen wird, wird der "Name" geändert.
Hier ist eine andere Alternative. Es verwendet nur eine Zeichenfolge, um die Funktion zu identifizieren. Diese Methode löst das Problem des sich ändernden Namens, führt jedoch zu einem Wartungsproblem. Die Zeichenfolge müsste mit dem Funktionsnamen bei der zukünftigen Refactorisierung synchronisiert werden.
Wenn der Speicherort der Funktion wichtiger als der Name ist, ist das folgende möglicherweise besser. Es gibt der Funktion einen Namen, der auf der Quell- und Zeilennummer basiert.
function getfunctionlocation()
local w = debug.getinfo(2, "S")
return w.short_src..":"..w.linedefined
end
function foo()
print(getfunctionlocation()) --> foo.lua:6
--...
end
Wenn die __func__
noch besser scheint, und Standard-Lua ist nicht wichtig, dann kann der Lua-Parser modifiziert werden, wie es in this example for __FILE__
and __LINE__
ist.
Funktionen haben sie nicht unbedingt. In Lua ist es völlig legal, anonyme Funktionen ohne Namen zu erstellen - und sie zu benennen, ohne sie zu benennen.
(function()
print("in anonymous function!")
end)()
Ist perfekt Lua. Welchen Namen möchtest du dieser Funktion geben?
in Stacktraces erscheinen diese Funktionen als '', wobei $ LINE die Zeile ist, wo die Funktion erscheint. –
können Sie versuchen:
local dbFunc = debug.getinfo(1) and debug.getinfo(1).name or ""
Info
Info["currentline"] = 1376
Info["source"] = "@.\mymod.lua"
Info["short_src"] = ".\mymod.lua"
Info["nups"] = 13
Info["isvararg"] = false
Info["what"] = "Lua"
Info["lastlinedefined"] = 1570
Info["func"] = function: 000000000030B440
Info["istailcall"] = false
Info["linedefined"] = 1375
Info["namewhat"] = "field"
Info["name"] = "ExportDB" <<--- See here the function name
Info["nparams"] = 4
debug.getinfo(1)
gibt diese Struktur des aktuellen Ausführungszustand der aktiven Funktion in dem Stapel.
Wenn n größer als die Anzahl der aktiven Funktionen im Stack ist, gibt debug.getinfo()
den Wert nil zurück.
Deshalb sollten Sie überprüfen, wenn es * .name vor der Einnahme und zurück eine leere Zeichenfolge, wenn die Informationen
A nicht verfügbar existiert, ist es in der ExportDB()
Funktion aufgerufen wird, kehrt er seinen Namen
Minor note (ja, ich weiß, das ist ein alter thread): mit 'debug.getinfo (1) oder" "funktioniert das genauso wie' debug.getinfo (1) und debug.getinfo (1) oder "" ' – tupperkion
function __FILE__() return debug.getinfo(2, 'S').source end
function __LINE__() return debug.getinfo(2, 'l').currentline end
function __FUNC__() return debug.getinfo(2, 'n').name end
function printlinefilefunc()
print("Line at "..__LINE__()..", FILE at "..__FILE__()..", in func: "..__FUNC__())
end
Ausgang:
Linie 8, FILE bei @/andydebug..lua, in func: printlinefilefunc
Was versuchen Sie zu erreichen? – lhf
Siehe diesen Beitrag http://stackoverflow.com/questions/4021816/in-lua-how-can-you-print-the-name-of-the-current-function-like-the-c99-func/4037184# 4037184 für das, was ich erreichen möchte :) –