Ссылаться как на более ранние, так и на более поздние функции из других функций?

У меня есть сценарий Lua, который представляет собой интерактивное текстовое меню для настройки сценария перед тем, как приступить к работе. Существует функция main_menu(), у которой есть параметры, которые может выбрать пользователь, каждый из которых вызывает другую функцию submenu(). Каждая из этих различных функций submenu() делает свое дело, а затем возвращается к (вызывает) функцию main_menu(). Наконец, каждой функции передается параметр settings, представляющий собой таблицу настроек.

Вещи выглядят так:

local function submenu(settings)
    -- Get user input & change a settings{} table key accordingly
    main_menu(settings)
end

local function main_menu(settings)
    -- Present choices & get user input
    submenu(settings)
end

local settings={}
settings["foo"] = "bar"

main_menu(settings)

Проблема в том, что я получаю attempt to call nil ошибок всякий раз, когда (насколько я могу судить) функция вызывает другую функцию, которая определена позже в сценарии. Итак, если, как в приведенном выше примере, я определяю submenu() и затем main_menu(), main_menu() без проблем вызывает submenu(), но submenu() не может вызывать main_menu().

FWIW, это делается в моде ComputerCraft для Minecraft.


person Sandwich    schedule 26.12.2012    source источник
comment
Спасибо за эти ссылки; Я искал эту проблему в Google перед публикацией, но не смог найти ничего подходящего, и я не видел ничего похожего на те темы в предложениях тем, которые были представлены, когда я публиковал эту. Должно быть, использовал неправильные ключевые слова.   -  person Sandwich    schedule 26.12.2012


Ответы (1)


Вы можете сделать local function с предварительным объявлением следующим образом:

local main_menu

local function submenu(settings)
    -- Get user input & change a settings{} table key accordingly
    main_menu(settings)
end

main_menu = function(settings)
    -- Present choices & get user input
    submenu(settings)
end

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

function submenu(settings)
    -- Get user input & change a settings{} table key accordingly
    main_menu(settings)
end

function main_menu(settings)
    -- Present choices & get user input
    submenu(settings)
end
person cctan    schedule 26.12.2012
comment
Верхняя строка первого ответа имеет недопустимый синтаксис; вам нужно использовать local main_menu, а не local function main_menu для предварительного объявления. - person furq; 26.12.2012
comment
Хмм хорошо. Из того, что я читал (балуюсь с Lua всего 2 дня), лучше держаться подальше от глобальных, если это вообще возможно, поэтому я попытаюсь реализовать первое предоставленное вами решение. Фактическая программа имеет целую кучу функций подменю; Будет ли что-то принципиально неправильное в том, чтобы просто объявить их все одним махом вверх (local main_menu local submenu_1 local submenu_2 и т. д.) и только затем определить их все? - person Sandwich; 26.12.2012
comment
@Sandwich В контексте компьютерного мастерства я не вижу в этом проблем;) - person cctan; 27.12.2012