Подтвердить что ты не робот

Вперед определить функцию в Lua?

Как мне вызвать функцию, которая должна быть вызвана сверху ее создания? Я прочитал что-то о форвардных объявлениях, но Google в этом случае не помогает. Каков правильный синтаксис для этого?

Спасибо.

4b9b3361

Ответ 1

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

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

Например, здесь пара взаимно-рекурсивных локальных функций:

local a,b
a = function() return b() end
b = function() return a() end

Конечно, это также пример использования хвостовых вызовов для бесконечной рекурсии, которая ничего не делает, но здесь речь идет о объявлениях. Объявляя переменные с local, перед тем как либо будет храниться в ней функция, эти имена, как известно, являются локальными переменными в лексической области остальной части примера. Затем сохраняются две функции, каждая из которых ссылается на другую переменную.

Ответ 2

Вы можете переслать декларацию функции, объявив ее имя перед объявлением фактического тела функции:

local func1
local func2 = function()
  func1()
end
func1 = function()
  --do something
end

Однако форвардные декларации необходимы только при объявлении функций с локальной областью. Это, как правило, то, что вы хотите сделать, но Lua также поддерживает синтаксис, более похожий на C, и в этом случае форвардное объявление не требуется:

function func2()
  func1()
end
function func1()
  --do something
end

Ответ 3

Тестирование под встроенным lua в Freeswitch, форвардное объявление не работает:

fmsg("CRIT", "It worked.")
function fmsg(infotype, msg)
   freeswitch.consoleLog(infotype,  msg .. "\n")
end

результат:

[ERR] mod_lua.cpp: 203/usr/local/freeswitch/scripts/foo.lua:1: попытаться вызвать глобальный 'fmsg' (значение nil)

Реверсирование порядка выполняется (duh).