我在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
在卢阿中可能会有可能吗?或使用C API?
呼叫debug.getinfo(f(返回包含有关f的信息的表。特别是
-
debug.getinfo(f).nparams
在f
中给出参数数量 -
debug.getinfo(f).isvararg
告诉f是否接受可变数量的参数
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 ", "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