Определение возможности вызова значения

Обратите внимание, что этот вопрос касается чистого Lua. У меня нет доступа к какому-либо модулю или стороне C. Кроме того, я не могу использовать IO, ОС или библиотеку отладки.

Я пытаюсь создать функцию, которая принимает в качестве параметров:

  • число в секундах
  • вызываемое значение

Под «вызываемым значением» я подразумеваю значение что можно назвать. Это может быть:

  • функция
  • таблица с метатаблицей, которая позволяет вызывать (через метаметод __ 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 , тогда я могу проверить метатаблицу, чтобы узнать, вызывается, но в противном случае, как бы я это сделал?

Обратите внимание, что я также думал о попытке вызвать параметр 'func' с помощью pcall , чтобы проверить, вызывается ли он, но чтобы сделать это, я должен назвать это преждевременно.

По сути, вот проблема: Мне нужно знать, можно ли вызвать функцию / таблицу, но не пытаясь ее вызвать.

5
задан Mark 26 September 2011 в 04:08
поделиться