当前位置 : 主页 > 网络编程 > lua >

lua – 知道是否可以调用一个值

来源:互联网 收集:自由互联 发布时间:2021-06-23
请注意,这个问题是关于纯Lua.我无权访问任何模块或C端.另外,我不能使用IO,OS或调试库. 我想要做的是一个接收的函数,作为参数: 一个数字,是第二个 可调用的值 通过’可调用值’,我的
请注意,这个问题是关于纯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>)
网友评论