Erhalte den lua-Befehl, wenn eine c-Funktion aufgerufen wird

8

Es wird angenommen, dass ich viele verschiedene Funktionsnamen in Lua für dieselbe Funktion in C anmelde. Kann ich nun bei jedem Aufruf meiner C-Funktion feststellen, welcher Funktionsname aufgerufen wurde?

zum Beispiel:

%Vor%

Also, wie bekomme ich den Namen der Funktion, die es heißt?

    
Nick Banks 25.05.2010, 18:02
quelle

5 Antworten

11

Eine andere Möglichkeit, Ihre Frage anzugehen, besteht darin, upvalues ​​ zu verwenden. Grundsätzlich registrieren Sie die C-Funktionen mit der Funktion unten statt lua_register :

%Vor%

Dann ist getFunctionName einfach

%Vor%

Das heißt, was Sie zu tun versuchen, scheint fischig zu sein - was wollen Sie erreichen? Die Funktion runCommand , die in der Frage gepostet wird, sieht wie eine schrecklich ineffiziente Art aus, etwas zu tun, was Lua sowieso für dich tut.

    
sbk 25.05.2010, 19:47
quelle
2

Sie können lua_getinfo: Ссылка

verwenden

Dies könnte funktionieren:

%Vor%

Es gibt eine Einschränkung:

  

name: ein vernünftiger Name für die angegebene Funktion. Da Funktionen in Lua erstklassige Werte sind, haben sie keinen festen Namen: einige Funktionen können den Wert mehrerer globaler Variablen haben, während andere nur in einem Tabellenfeld gespeichert werden können. Die Funktion lua_getinfo prüft, wie die Funktion aufgerufen wurde, um einen passenden Namen zu finden. Wenn es keinen Namen finden kann, wird name auf NULL gesetzt.

    
Nick Van Brunt 25.05.2010 18:33
quelle
2

Eine alternative Lösung wäre, eine Metatabelle für die Lua-Umgebungstabelle zu registrieren, die die __index -Metamethode für das Versenden dieser Funktionsaufrufe implementiert.

    
Judge Maygarden 25.05.2010 18:50
quelle
0

Leider ist das nicht möglich - unter anderem, weil Funktionen in Lua eigentlich gar keinen Namen haben müssen. (Beachte: (loadstring("a=1"))() führt eine namenlose Funktion aus, die von loadstring zurückgegeben wurde.)

    
Amber 25.05.2010 18:19
quelle
0

Wenn Sie bereit sind, alle unbekannten Funktionen auszuführen, können Sie möglicherweise Spiele mit setmetable und currying :

%Vor%

In diesem Beispiel habe ich unbekannte Ausführungen nur unter _util und nicht in der globalen Tabelle geschlürft.

    
leander 25.05.2010 19:00
quelle

Tags und Links