Вызов локальной функции внутри другой локальной функции - PullRequest
0 голосов
/ 26 сентября 2018

Следующий фрагмент

local function foo ()
    print('inside foo')
    bar()
end

local function bar ()
    print('inside bar')
end

foo()

Результатом будет следующий вывод

inside foo
lua: teste.lua:3: attempt to call global 'bar' (a nil value)
stack traceback:
        teste.lua:3: in function 'foo'
        teste.lua:10: in main chunk
        [C]: ?

Если я уберу модификатор local из объявления bar, то он будет работать как положено, выдав

inside foo
inside bar

Как я могу позвонить bar внутри foo, сохраняя оба значения local?

Ответы [ 2 ]

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

Фактически:

local function foo () end

Эквивалент

local foo  
foo = function() end  

В Lua функция является первоклассным значением.Поэтому его нельзя использовать до его определения.

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

Вам нужно определить bar перед foo.

local function bar ()
    print('inside bar')
end

local function foo ()
    print('inside foo')
    bar()
end

foo()

В вашем примере, когда вы находитесь внутри функции foo, то, насколько Lua касается bar не делает 'пока не существует.Это означает, что по умолчанию используется глобальная переменная со значением nil, поэтому вы получаете сообщение об ошибке «попытка вызвать глобальный 'bar' (нулевое значение)".

Если вы хотите определить foo до bar и сохраните их обе как локальные переменные, вам нужно сначала объявить переменную bar.

local bar

local function foo ()
    print('inside foo')
    bar()
end

function bar ()
    print('inside bar')
end

foo()

В этом примере, если вы хотите доказать себе, что bar является локальнойпеременная, вы можете добавить следующий код в конце:

if _G.bar ~= nil then
    print("bar is a global variable")
else
    print("bar is a local variable")
end

Это проверяет, является ли "бар" ключом в _G, таблице глобальных переменных.

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