Как debug.traceback получает информацию? - PullRequest
0 голосов
/ 02 сентября 2018

С помощью приведенного ниже кода со демонстрационной страницы Lua я пытался получить название функции, которая была вызвана.

function test()
    local info = debug.getinfo(1);

    for k, v in pairs(info) do
        print(k, v);
    end;
end;

pcall(function()
    test();
end);

Это был успех, так как я получил следующий вывод, содержащий имя:

source  =input
func    function: 0x25a1830
nparams 0
short_src   input
isvararg    false
name    test
namewhat    global
istailcall  false
linedefined 1
lastlinedefined 7
nups    1
currentline 2
what    Lua

Если я изменю код на следующий, я больше не получу эту информацию:

function test()
    local info = debug.getinfo(1);

    for k, v in pairs(info) do
        print(k, v);
    end;
end;

pcall(test);

Вывод выглядит следующим образом:

func    function: 0x21ee790
linedefined 1
nups    1
short_src   input
namewhat    
lastlinedefined 7
isvararg    false
istailcall  false
what    Lua
source  =input
currentline 2
nparams 0

Однако, если я изменю код на следующий, я могу получить имя функции, переданной в pcall:

function test()
    local traceback = debug.traceback();

    print(traceback);
end;

pcall(test);

Вывод будет следующим:

stack traceback:
    input:2: in function 'test'
    [C]: in function 'pcall'
    input:7: in main chunk
    [C]: in function 'pcall'
    demo.lua:49: in main chunk
    [C]: in ?

Как debug.traceback получает эту дополнительную информацию, и, используя только Lua, есть ли способ получить ее, не извлекая ее из возвращаемого значения debug.traceback?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Функции являются значениями. Значения не имеют имен.

Функции не "объявлены", как в некоторых других языках. Значение функции создается при оценке определения функции.

Отладочный вывод просто пытается помочь в простых случаях, давая имя переменной, связанной с вызовом значения функции.

0 голосов
/ 03 сентября 2018

debug.getinfo и debug.traceback получают информацию из разных источников, некоторые из них хакерские. Например, имя функции, как правило, извлекается из исходного кода вызывающей функции: какое бы имя код ни использовал для поиска вызываемого объекта, оно используется в качестве имени. (Вот почему ваш второй фрагмент кода не дал вам имя: pcall не имеет байт-кода Lua для его резервного копирования, поэтому он не может сказать вам "test", если в середине нет функции для его вызова "test" Msgstr "Функции Lua не имеют собственных имен, равно как и целые числа Lua; функция - это просто другой тип значения, которое может быть автоматически присвоено переменной с помощью некоторого синтаксического сахара.

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