2012-12-26 48 views
0

我有一个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,这是在Minecraft的ComputerCraft mod中完成的。

+0

可能重复的[Lua的功能范围问题( http://stackoverflow.com/questions/6394721/lua-function-range-problem)和[如何在代码中调用函数(在它被定义之前)?](http://stackoverflow.com/questions/12291203/LUA-如何通话功能从 - 上述它功能于代码之前至它感画质内) – finnw

+0

感谢您的链接;我在发布之前曾在Google上搜索过这个问题,但无法找到任何相关的内容,也没有看到在发布这篇文章时提供的线索建议中的那些线索。穆斯塔一直在使用错误的关键字。 – Sandwich

回答

2

你既可以做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 
+0

第一个答案的第一行是无效的语法;您需要使用'local main_menu'而不是'local function main_menu'来进行前向声明。 – furq

+0

@furq编辑,感谢您的注意 – cctan

+0

嗯,好的。从我读过的内容(只涉及两天的Lua),如果可能的话最好远离全局,所以我会尽力实现你提供的第一个解决方案。实际的程序有一大堆“子菜单”功能;会有什么内在的错误,只是一举宣布他们全部顶部('本地main_menu本地submenu_1本地submenu_2'等),然后才定义它们全部? – Sandwich