В Lua, как вы можете напечатать имя текущей функции, например, идентификатор C99 __func__? - PullRequest
11 голосов
/ 26 октября 2010

Примерно так:

function foo()
    print( __func__ )
   ...
end

Как это можно сделать?

Ответы [ 7 ]

28 голосов
/ 26 октября 2010
#!/usr/bin/lua

local function myFunc()
 print(debug.getinfo(1, "n").name);
end
myFunc()
11 голосов
/ 26 октября 2010

Вы не можете.В lua функции являются переменными первого класса.Поэтому у них нет имен.Вы могли бы также спросить «как зовут 2».То, что какой-то переменной было присвоено значение «2», не делает эту переменную именем 2. Аналогично, «someFunc» является переменной - потенциально одной из многих - которая содержит определенную функцию.

4 голосов
/ 24 ноября 2016
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, ФАЙЛ в @. / Andydebug.lua, в func: printlinefilefunc

4 голосов
/ 27 октября 2010

Хотя я согласен с ответом Эфраима , этот код не всегда будет содержать одно и то же имя, как указано Крисом Бекке.Когда функция назначается другой переменной, «имя» будет изменено.

Вот еще одна альтернатива.Он просто использует строку для идентификации функции.Этот метод решает проблему изменения имени, но вводит проблему обслуживания.Строка должна быть синхронизирована с именем функции с последующей рефакторизацией.

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__.

3 голосов
/ 28 октября 2010

Функции не обязательно имеют их.В Lua совершенно законно создавать анонимные функции без имени - и вызывать их, не назначая их.

(function()
    print("in anonymous function!")
end)()

Совершенно допустимо Lua.Какое имя вы хотите дать этой функции?

3 голосов
/ 26 октября 2010

Используйте библиотеку отладки .Он предоставляет функцию getinfo(func), которая возвращает таблицу с информацией о функции.

0 голосов
/ 11 сентября 2015

Вы можете попробовать:

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() возвращает ноль.

. Поэтому вам нужно проверить, существует ли он, прежде чем принимать * .name и вернуть пустую строку, если информация недоступна

A itвызывается внутри функции ExportDB(), возвращает имя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...