首页 > 解决方案 > 如何获取表中函数期望的参数数量?

问题描述

我在 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?

标签: lua

解决方案


对于 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

推荐阅读