lua - получить список имен параметров функции извне функции
Я генерирую некоторую (не HTML) документацию для библиотеки Lua, которую я разработал. Я буду создавать документацию вручную, но я буду признателен за некоторую автоматизацию, если это возможно (например, создание скелетов для каждой функции, чтобы я мог их заполнить)
Я хотел бы знать, есть ли способ для lua узнать имена параметров, которые принимает функция, вне ее.
Например, есть ли способ сделать это в Lua?
function foo(x,y)
... -- any code here
end
print( something ... foo ... something)
-- expected output: "x", "y"
Большое спасибо.
5 ответов
Взгляни на debug.getinfo
, но вам, вероятно, нужен парсер для этой задачи. Я не знаю ни одного способа извлечь параметры функции из Lua, не запустив ее и не проверив ее таблицу окружения (см. debug.debug
а также debug.getlocal
).
Хорошо, вот основной код:
function getArgs(fun)
local args = {}
local hook = debug.gethook()
local argHook = function( ... )
local info = debug.getinfo(3)
if 'pcall' ~= info.name then return end
for i = 1, math.huge do
local name, value = debug.getlocal(2, i)
if '(*temporary)' == name then
debug.sethook(hook)
error('')
return
end
table.insert(args,name)
end
end
debug.sethook(argHook, "c")
pcall(fun)
return args
end
и вы можете использовать так:
print(getArgs(fun))
Попробуйте мою библиотеку инспектора байт-кода. В Lua 5.2 вы сможете использовать debug.getlocal
,
function GetArgs(func)
local args = {}
for i = 1, debug.getinfo(func).nparams, 1 do
table.insert(args, debug.getlocal(func, i));
end
return args;
end
function a(bc, de, fg)
end
for k, v in pairs(GetArgs(a)) do
print(k, v)
end
напечатает
1 bc
2 de
3 fg
В основном мы используем
debug.getinfo
получить
nparams
атрибут (который дает нам информацию о том, сколько параметров принимает функция) и
debug.getlocal
для доступа к имени параметров.
Протестировано и работает с Lua 5.4
Посмотрите на утилиту luadoc. Это похоже на Doxygen, но для Lua. Он предназначен для того, чтобы документация могла быть написана в соответствии с исходным кодом, но она, безусловно, могла бы использоваться для создания шаблона структуры документации, который должен быть выделен отдельно. Конечно, механизм шаблонов оставит вас с проблемой обслуживания в будущем...