2010-10-26 9 views

Antwort

24
#!/usr/bin/lua 

local function myFunc() 
print(debug.getinfo(1, "n").name); 
end 
myFunc() 
3

Verwenden Sie die Debug Library. Es bietet eine getinfo(func) Funktion, die eine Tabelle mit Informationen über die Funktion zurückgibt.

8

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.

4

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.

3

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?

+1

in Stacktraces erscheinen diese Funktionen als '', wobei $ LINE die Zeile ist, wo die Funktion erscheint. –

0

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

+2

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

3
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

Verwandte Themen