【问题标题】:lua - get the list of parameter names of a function, from outside the functionlua - 从函数外部获取函数的参数名称列表
【发布时间】:2010-06-22 21:16:39
【问题描述】:

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

我想知道 lua 是否有办法从函数外部知道函数采用的参数的名称。

例如,有没有办法在 Lua 中做到这一点?

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

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

非常感谢。

【问题讨论】:

    标签: lua


    【解决方案1】:

    好的,核心代码如下:

    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))
    

    【讨论】:

      【解决方案2】:

      试试我的bytecode inspector library。在 Lua 5.2 中,您将能够使用 debug.getlocal

      【讨论】:

      • 我想我现在会坚持使用 lua 的调试功能。但是谢谢你的回答。我认为这对其他人发现这个问题很有用。
      【解决方案3】:

      看看debug.getinfo,但你可能需要一个解析器来完成这个任务。我不知道有什么方法可以在不实际运行函数并检查其环境表的情况下从 Lua 中获取函数的参数(参见 debug.debugdebug.getlocal)。

      【讨论】:

      • 谢谢。那些应该是指向某个地方的链接吗?
      • 是的,它们是在线 Lua 参考手册相应部分的链接。
      • 我将尝试使用 debug.getinfo。谢谢!
      【解决方案4】:

      看看luadoc 实用程序。它有点像 Doxygen,但对于 Lua。它旨在允许文档与源代码内联编写,但它当然可以用于生成文档结构的模板以单独充实。当然,模板机制会给您留下维护问题...

      【讨论】:

      • 我对@9​​87654323@ 的体验很差。相反,我一直在编写文档作为模块中的元数据。对于发帖者的问题,我认为lhf的回答是肯定的。
      • Luadoc 确实很古怪。 Lua 并不容易为函数获得良好的文档签名,而 luadoc 的大部分怪癖都与此有关。我在用 C 语言编写的 Lua 库的文档方面遇到了相关问题,其中 Doxygen 根本没有帮助,因为所有 Lua 可调用函数都具有相同的不透明签名。
      • @Norman Ramsey:我想更多地了解您所说的“模块中的元数据”。你有任何样本/文件吗?
      • @Norman Ramsey:我为此提出了一个不同的问题:stackoverflow.com/questions/3100062/…
      【解决方案5】:
      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-17
        • 2016-01-04
        • 2010-10-09
        相关资源
        最近更新 更多