在 Lua 5.1 中检查函数签名
Inspect function signature in Lua 5.1
在this answer中,提供了一种检查Lua函数签名的方法。答案指出:
This algorithm works with Lua 5.2. Older versions would be similar but not the same:
Lua 5.1 中的等价物是什么?
function funcsign(f)
assert(type(f) == 'function', "bad argument #1 to 'funcsign' (function expected)")
local p = {}
pcall(
function()
local oldhook
local delay = 2
local function hook(event, line)
delay = delay - 1
if delay == 0 then
for i = 1, math.huge do
local k, v = debug.getlocal(2, i)
if type(v) == "table" then
table.insert(p, "...")
break
elseif (k or '('):sub(1, 1) == '(' then
break
else
table.insert(p, k)
end
end
if debug.getlocal(2, -1) then
table.insert(p, "...")
end
debug.sethook(oldhook)
error('aborting the call')
end
end
oldhook = debug.sethook(hook, "c")
local arg = {}
for j = 1, 64 do arg[#arg + 1] = true end
f((table.unpack or unpack)(arg))
end)
return "function("..table.concat(p, ",")..")"
end
用法:
local function somefunc(a, b, c, ...)
return
end
print(funcsign(somefunc))
在this answer中,提供了一种检查Lua函数签名的方法。答案指出:
This algorithm works with Lua 5.2. Older versions would be similar but not the same:
Lua 5.1 中的等价物是什么?
function funcsign(f)
assert(type(f) == 'function', "bad argument #1 to 'funcsign' (function expected)")
local p = {}
pcall(
function()
local oldhook
local delay = 2
local function hook(event, line)
delay = delay - 1
if delay == 0 then
for i = 1, math.huge do
local k, v = debug.getlocal(2, i)
if type(v) == "table" then
table.insert(p, "...")
break
elseif (k or '('):sub(1, 1) == '(' then
break
else
table.insert(p, k)
end
end
if debug.getlocal(2, -1) then
table.insert(p, "...")
end
debug.sethook(oldhook)
error('aborting the call')
end
end
oldhook = debug.sethook(hook, "c")
local arg = {}
for j = 1, 64 do arg[#arg + 1] = true end
f((table.unpack or unpack)(arg))
end)
return "function("..table.concat(p, ",")..")"
end
用法:
local function somefunc(a, b, c, ...)
return
end
print(funcsign(somefunc))