Что-то вроде этого:
function foo()
print( __func__ )
...
end
Как это можно сделать?
Что-то вроде этого:
function foo()
print( __func__ )
...
end
Как это можно сделать?
#!/usr/bin/lua
local function myFunc()
print(debug.getinfo(1, "n").name);
end
myFunc()
Вы не можете. В lua функции - это переменные первого класса. Поэтому у них нет имен. Вы также можете спросить "что такое имя 2". Просто потому, что некоторая переменная была назначена, значение "2" не делает эту переменную именем 2. Аналогично "someFunc" - это переменная - потенциально одна из многих - которая содержит определенную функцию.
Пока я согласен с ответом Ephraim, этот код не всегда будет сообщать то же имя, что указано Крисом Бекке. Когда функция назначена другой переменной, "имя" будет изменено.
Вот еще одна альтернатива. Он просто использует строку для идентификации функции. Этот метод решает проблему изменения имен, но вводит проблему обслуживания. Строку нужно будет синхронизировать с именем функции с будущей рефакторизацией.
function foo()
local __func__ = "foo"
print( __func__ )
--...
end
В качестве альтернативы, если местоположение функции более важно, чем имя, может быть лучше. Он даст имя функции, которая основана на номере источника и номера.
function getfunctionlocation()
local w = debug.getinfo(2, "S")
return w.short_src..":"..w.linedefined
end
function foo()
print(getfunctionlocation()) --> foo.lua:6
--...
end
Если __func__
все еще кажется лучше, а стандартный Lua не важен, то парсер Lua может быть изменен так, как он есть в этот пример для __FILE__
и __LINE__
.
Используйте Отладочную библиотеку. Он предоставляет функцию getinfo(func)
, которая возвращает таблицу с информацией о функции.
Функции не обязательно имеют их. Это совершенно законно в Lua для создания анонимных функций без имени и вызова, не назначая его.
(function()
print("in anonymous function!")
end)()
Совершенно верно Lua. Какое имя вы хотите отдать этой функции?
function __FILE__() return debug.getinfo(2, 'S').source end
function __LINE__() return debug.getinfo(2, 'l').currentline end
function __FUNC__() return debug.getinfo(2, 'n').name end
function printlinefilefunc()
print("Line at "..__LINE__()..", FILE at "..__FILE__()..", in func: "..__FUNC__())
end
Вывод:
Линия в 8, FILE в @./andydebug.lua, в func: printlinefilefunc
Вы можете попробовать:
local dbFunc = debug.getinfo(1) and debug.getinfo(1).name or ""
Info
Info["currentline"] = 1376
Info["source"] = "@.\mymod.lua"
Info["short_src"] = ".\mymod.lua"
Info["nups"] = 13
Info["isvararg"] = false
Info["what"] = "Lua"
Info["lastlinedefined"] = 1570
Info["func"] = function: 000000000030B440
Info["istailcall"] = false
Info["linedefined"] = 1375
Info["namewhat"] = "field"
Info["name"] = "ExportDB" <<--- See here the function name
Info["nparams"] = 4
debug.getinfo(1)
Возвращает эту структуру текущего состояния выполнения активной функции в стеке.
Если n больше числа активных функций в стеке, debug.getinfo()
возвращает nil.
Вот почему вы должны проверить, существует ли это, прежде чем принимать *.name и возвращать пустую строку, если информация недоступна
A он вызывается внутри функции ExportDB()
, он возвращает свое имя