2012-12-26 91 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