如何获取表中函数期望的参数数量?

时间:2019-07-04 07:48:21

标签: lua

我在Lua表t中有函数,并且我了解到可以通过运行以下脚本来列出t包含的所有函数:

for k, v in pairs(t) do
  print(k, v)
end

例如将打印:

myfunction1 function: 0x107219805
myfunction2 function: 0x10721c194
myfunction3 function: 0x1071e067c

现在,我想知道是否有可能获得每个函数期望的参数数量。因此结果可能如下所示:

myfunction1 function: 0x107219805 arguments: 3
myfunction2 function: 0x10721c194 arguments: 4
myfunction3 function: 0x1071e067c arguments: 5

在Lua中这可能吗?还是使用C API?

2 个答案:

答案 0 :(得分:4)

对于Lua 5.2+,请参见lhf的答案。

这是仅适用于Lua 5.1的解决方案
(您可以将两种解决方案组合为一个)

local function get_numparams_isvararg(func)
   -- returns num_param (number), is_vararg (boolean)
   local s = string.dump(func)
   assert(s:sub(1, 6) == "\27LuaQ\0", "This code works only in Lua 5.1")
   local int_size = s:byte(8)
   local ptr_size = s:byte(9)
   local pos = 14 + ptr_size + (s:byte(7) > 0 and s:byte(13) or s:byte(12 + ptr_size)) + 2 * int_size
   return s:byte(pos), s:byte(pos + 1) > 0
end

用法示例:

local function f(a, b, c, ...)
end

local function g()
end

print(get_numparams_isvararg(f))  --> 3  true
print(get_numparams_isvararg(g))  --> 0  false

答案 1 :(得分:3)

调用debug.getinfo(f)返回一个包含有关f的信息的表。特别是

  • debug.getinfo(f).nparams给出f中的参数数量
  • debug.getinfo(f).isvararg告诉f是否接受可变数量的参数