Lua - 在函数之外获取函数的参数名称列表

我正在为我开发的一个 Lua 库生成一些非 HTML 的文档。我将手动生成文档,但如果可能的话,我会很感激一些自动化(例如为每个函数生成框架,以便我可以填写它们)。

我想知道是否有一种方法让 Lua 从函数外部知道它所采用的参数名称。

例如,是否有一种方式在 Lua 中实现这一点?

function foo(x,y)
  ... -- any code here
end

print( something ... foo ... something)
-- expected output: "x", "y"

非常感谢。

原文链接 https://stackoverflow.com/questions/3097209

点赞
stackoverflow用户1491
stackoverflow用户1491

请查看 debug.getinfo,但是你可能需要一个解析器来完成这个任务。我不知道是否有任何方法可以在 Lua 中获取函数参数而不实际运行该函数并检查其环境表格(请参见 debug.debugdebug.getlocal)。

2010-06-22 21:52:45
stackoverflow用户68204
stackoverflow用户68204

看一下 luadoc 实用工具。它类似于 Doxygen,但适用于 Lua。它旨在允许文档与源代码内联编写,但肯定也可以用来生成文档结构的模板,以便单独进行完善。当然,模板机制将给你留下后续维护问题……

2010-06-23 01:21:18
stackoverflow用户107090
stackoverflow用户107090

尝试使用我的 bytecode inspector library。在 Lua 5.2 中你可以使用 debug.getlocal

2010-06-23 01:37:08
stackoverflow用户4705704
stackoverflow用户4705704

这是核心代码:

function getArgs(fun)
local args = {}
local hook = debug.gethook()

local argHook = function( ... )
    local info = debug.getinfo(3)
    if 'pcall' ~= info.name then return end

    for i = 1, math.huge do
        local name, value = debug.getlocal(2, i)
        if '(*temporary)' == name then
            debug.sethook(hook)
            error('')
            return
        end
        table.insert(args,name)
    end
end

debug.sethook(argHook, "c")
pcall(fun)

return args
end

你可以这样使用:

print(getArgs(fun))
2015-03-25 02:12:19
stackoverflow用户6472546
stackoverflow用户6472546
function GetArgs(func)
    local args = {}
    for i = 1, debug.getinfo(func).nparams, 1 do
        table.insert(args, debug.getlocal(func, i));
    end
    return args;
end

function a(bc, de, fg)
end

for k, v in pairs(GetArgs(a)) do
  print(k, v)
end

运行结果:

1   bc
2   de
3   fg

基本上我们使用 debug.getinfo 来检索 nparams 属性(它提供了关于函数有多少个参数的信息),并且使用 debug.getlocal 来访问参数的名称。

经过测试,在 Lua 5.4 中运行正常。

2021-10-13 23:21:39