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

我有一个包含 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?

点赞
用户107090
用户107090

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

  • debug.getinfo(f).nparams 给出 f 中参数的数量
  • debug.getinfo(f).isvararg 告诉我们 f 是否接受可变数量的参数。
2019-07-04 11:57:03
用户6834680
用户6834680

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

这是针对 Lua 5.1 的解决方案

(您可以将这两个解决方案合并为一个)

local function get_numparams_isvararg(func)
   -- 返回 num_param(数字),is_vararg(布尔值)
   local s = string.dump(func)
   assert (s:sub1,6)==“\ 27LuaQ \ 0”,“此代码仅适用于 Lua 5.1”)
   local int_size = s:byte8local ptr_size = s:byte9local pos = 14 + ptr_size +(s:byte7)> 0 and s:byte13or s:byte12 + 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
2019-07-04 15:35:31