请注意,这个问题是关于纯Lua.我无权访问任何模块或C端.另外,我不能使用IO,OS或调试库. 我想要做的是一个接收的函数,作为参数: 一个数字,是第二个 可调用的值 通过’可调用值’,我的
我想要做的是一个接收的函数,作为参数:
>一个数字,是第二个
>可调用的值
通过’可调用值’,我的意思是可以调用的值.这可以是:
>一个功能
>一个带有metatable的表,允许调用(通过__call元方法)
这是一个可调用表的示例:
local t = {} setmetatable(t, { __call = function() print("Hi.") end }) print(type(t)) --> table t() --> Hi.
这是功能:
function delay(seconds, func) -- The second parameter is called 'func', but it can be anything that is callable. coroutine.wrap(function() wait(seconds) -- This function is defined elsewhere. It waits the ammount of time, in seconds, that it is told to. func() -- Calls the function/table. end)() end
但我有一个问题.如果参数’func’不可调用,我希望函数抛出错误.
我可以检查它是否是一个功能.但是如果它是一个带有metatable的表允许调用呢?
如果表的metatable不受__metatable字段的保护,那么,我可以检查metatable以了解它是否可调用,但是,否则,我该怎么做?
请注意,我还考虑过尝试用pcall调用’func’参数来检查它是否可调用,但为了做到这一点,我需要过早地调用它.
基本上,这就是问题所在:我需要知道函数/表是否可调用,而不是试图调用它.
一般来说,如果metatable不希望你能够得到它(通过将__metatable定义为特殊的东西),那么你就不会得到它.不是来自Lua.但是,如果要作弊,可以始终使用debug.getmetatable,它将返回与该对象关联的元表.
你不必过早地使用pcall调用任何东西.注意:
pcall(function(...) return PossibleFunction(...) end, <insert arguments here>)