В Lua, как вы можете напечатать имя текущей функции, например идентификатор C99 __func__?

Что-то вроде этого:

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

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

Ответ 1

#!/usr/bin/lua

local function myFunc()
 print(debug.getinfo(1, "n").name);
end
myFunc()

Ответ 2

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

Ответ 3

Пока я согласен с ответом 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__.

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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(), он возвращает свое имя