5

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

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

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

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

我希望能够从另一个 Lua 脚本中显示这些函数名称(test1、test2)。

目前我能想到的唯一方法是使用 require 包含文件,然后在 _G 中列出函数 - 但这也将包括所有标准 Lua 函数。

当然,我可以使用字符串搜索函数手动解析文件,但这对我来说似乎不是很 Lua!

这最终将成为允许开发人员在 Lua 中编写函数的过程的一部分,并且操作员可以从 Excel 中的列表中选择调用哪些函数(yuk!)。

4

3 回答 3

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

如果您绝对必须将它们保持为原始形式,则必须以不同的方式加载它们以分离您的全局环境,然后以类似的方式对其进行迭代(_G也许在内部环境的 clean 上)。

于 2013-06-25T10:04:38.307 回答
3

我看到三种方式:

  1. 在加载脚本之前保存名称并与加载后_G留下的名称进行比较。_G我已经在 Lua 邮件列表或 wiki 中看到了一些代码,但我现在找不到链接。

  2. 通过解析luac列表来报告函数中使用的全局变量,如http://lua-users.org/lists/lua-l/2012-12/msg00397.html

  3. 在 Lua 中使用我的字节码检查器 lbci,其中包含一个报告全局变量的示例。

于 2013-06-25T10:28:41.703 回答
1

如果你想这样做,最好将函数定义为一个包,如《Lua 编程》一书中所述

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

然后你可以简单地迭代你的 table functions

于 2013-06-25T10:05:28.507 回答