2013-06-25 7 views
5

Wie kann ich eine Liste aller Funktionen in einem Lua-Quelldatei enthalten?Liste Lua Funktionen in einer Datei

Zum Beispiel habe ich fn.lua die

function test1() 
     print("Test 1") 
end 

function test2() 
     print("Test 2") 
end 

enthält Und ich wünsche der Lage sein, diese Funktionsnamen angezeigt werden (test1, test2) von einem anderen Lua-Skript.

Die einzige Art, wie ich im Moment herausfinden kann, die Datei schließen erfordert verwenden, dann die Funktionen in _G Liste - aber das wird alle Standard-Lua-Funktionen als auch enthalten.

Natürlich konnte ich analysieren nur die Datei, die die Zeichenfolge Suchfunktionen manuell verwenden, aber das scheint nicht sehr Lua zu mir!

Dies wird schließlich Teil eines Prozesses, der es dem Entwickler erlaubt, Funktionen in Lua zu schreiben, und der Operator, um auszuwählen, welche dieser Funktionen aus einer Liste in Excel aufgerufen werden (yuk!).

Antwort

6

Wenn man sie alle in einem "Modul" setzen (was sollten Sie wahrscheinlich tun, sowieso):

mymodule = { } 
function mymodule.test1() 
    print("Test 1") 
end 

function module.test2() 
    print("Test 2") 
end 

return mymodule 

Es wird trivial:

mymodule = require"mymodule" 

for fname,obj in pairs(mymodule) do 
    if type(obj) == "function" then 
     print(fname) 
    end 
end 

Wenn Sie unbedingt zu halten, um sie in Rohform, würden Sie sie auf eine andere Weise zu laden, um Ihre globale Umwelt zu trennen und dann über sie in ähnlicher Weise (über die innere env des _G gereinigt, vielleicht) iterieren.

+0

Ich hatte das Format der Eingabedatei zu ändern: ‚mymodule = {} Funktion mymodule.test1() print ("Test 1") Ende Funktion mymodule.test2() print ("Test 2") Ende return mymodule‘ –

+0

ah Recht, sorry, ich werde das in Ordnung bringen. –

+0

Auch - (und ich verstehe nicht, warum), sind die Funktionsnamen in mymodule Tabelle Strings nicht funktioniert. Aber mymodule.test1() funktioniert gut. –

1

Wenn Sie dies tun wollen, ist es besser, die Funktion zu definieren, ist ein Paket, as described in Programming in Lua book:

functions = {} 
function functions.test1() print('foo') end 
function functions.test2() print('bar') end 
return functions 

Dann können Sie einfach functions Tisch iterieren.

3

Ich sehe drei Möglichkeiten:

  1. Speicher, um die Namen in _G vor Ihrem Skript geladen und nach dem Laden in _G den Namen links zu vergleichen. Ich habe Code dafür gesehen, entweder in der Lua-Mailingliste oder im Wiki, aber ich kann gerade keinen Link finden.

  2. Melden Sie die in einer Funktion verwendeten Globals durch Analysieren von luac Listings, wie in http://lua-users.org/lists/lua-l/2012-12/msg00397.html.

  3. Verwenden Sie meinen Bytecode-Inspektor lbci von innerhalb Lua, die ein Beispiel enthält, das Globals meldet.

+0

Die Idee mit einem Unterschied von '_G' vorher und' _G' danach ist wirklich nett, ich würde nicht darüber nachdenken. –

+0

Ich dachte über _G zu vergleichen, aber hoffte es ein einfacherer Weg war. Ich mag die Idee von luac verwenden, da ich die Verwendung luac für grundlegende Syntaxprüfung gedacht habe. –

Verwandte Themen