Как получить количество аргументов, ожидаемых функцией в таблице? - PullRequest
2 голосов
/ 04 июля 2019

У меня есть функции внутри таблицы 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?

Ответы [ 2 ]

4 голосов
/ 04 июля 2019

Для 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\0", "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
3 голосов
/ 04 июля 2019

Вызов debug.getinfo (f) возвращает таблицу, содержащую информацию о f. В частности,

  • debug.getinfo(f).nparams дает количество параметров в f
  • debug.getinfo(f).isvararg сообщает, принимает ли f переменное количество аргументов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...