2013-06-25 56 views
5

如何列出包含在Lua源文件中的所有函數?在文件中列出Lua函數

例如,我有fn.lua其中包含

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

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

而且我希望能夠從另一個Lua中顯示這些功能名稱(TEST1,TEST2)。

我現在唯一可以確定的方法是使用require包含文件,然後在_G中列出這些函數 - 但這也包括所有標準的Lua函數。

當然,我可以使用字符串搜索功能手動解析文件,但這對我來說似乎不是很好!

這將最終形成一個過程的一部分,允許開發人員在Lua中編寫函數,操作員從Excel(yuk!)的列表中選擇哪些函數被調用。

回答

6

如果你把它們放在一個「模塊」(你可能應該做的,反正):

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

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

return mymodule 

它變得微不足道:

mymodule = require"mymodule" 

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

如果你非得讓他們在原始形式,您必須以不同的方式加載它們以分離全局環境,然後以類似的方式遍歷它(通過內部env的清理_G,也許)。

+0

我不得不改變輸入文件的格式:「MyModule的= {} 功能mymodule.test1() 打印( 「測試1」) 端 功能mymodule.test2() 打印( 「測試2」) 結束 返回mymodule' –

+0

啊對,對不起,我會解決這個問題。 –

+0

另外 - (我不明白爲什麼),mymodule表中的函數名稱是字符串而不是函數。但mymodule.test1()工作正常。 –

1

如果你想做到這一點,最好是定義函數是一個包,as described in Programming in Lua book

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

然後,你可以簡單地重複你的表functions

3

我看到三種方式:

  1. 保存在_G名加載你的腳本,並比較留在_G加載它後的名稱之前。我已經看到了一些代碼,無論是在Lua郵件列表還是在wiki中,但我現在都找不到鏈接。

  2. 通過解析luac列表來報告函數中使用的全局變量,如http://lua-users.org/lists/lua-l/2012-12/msg00397.html

  3. 在Lua中使用我的字節碼檢查器lbci,它包含一個報告全局變量的示例。

+0

以前'_G'和'_G'之間的區別非常好,我不會去想它。 –

+0

我想過比較_G,但希望有一個更簡單的方法。我喜歡使用luac的想法,因爲我正在考慮使用luac進行基本的語法檢查。 –