2016-03-01 50 views
3

我加載了一個要運行多次的Lua腳本,以及另一個Lua腳本,它充當了第一個腳本應該使用的庫。Lua問題 - 在運行之前加載庫文件

讓HelloWorldAPI.lua:

function HelloWorld() 
    return "Hello world" 
end 

而且SomeScript.lua:

HelloWorld() 

我正在做的事情按以下順序:

L = luaL_newstate(); 
luaL_openlibs(L); 
luaL_loadfile(L, "HelloWorldAPI.lua"); 
luaL_loadfile(L, "SomeScript.lua"); 
... 
lua_pcall(L, 0, 0, 0) 
... 
lua_pcall(L, 0, 0, 0) 
... 

(一些代碼段被刪除以保持簡單)

但我創建了一個錯誤,說我在調用HelloWorld函數時試圖調用一個零值。

爲什麼?

我在執行lib腳本時聲明的函數應該是全局的,因此可以在SomeScript.lua中使用,對嗎?

謝謝。

+0

爲什麼被標記爲'C'? – Shark

+3

因爲這是C. – Virus721

回答

3

luaL_loadfile();負載和編譯塊,將其放在堆棧的頂部,但不執行它,但(這樣,第一個電話後luaL_loadfile功能HelloWorld全球LUA狀態沒有定義。

然後,您加載文件SomeScript.lua,現在位於堆棧頂部現在調用lua_pcall現在嘗試調用(尚未)定義的函數HelloWorld這個塊,導致錯誤觀察。

考慮到這一點,那將是th Ë正確的順序:

luaL_loadfile(L, "HelloWorldAPI.lua"); 
lua_pcall(L, 0, 0, 0); 
luaL_loadfile(L, "SomeScript.lua"); 
lua_pcall(L, 0, 0, 0); 

然而,加載立即執行一個文件,你應該使用luaL_dofile

luaL_dofile(L, "HelloWorldAPI.lua"); 
luaL_dofile(L, "SomeScript.lua"); 
+0

感謝您的幫助!我沒有使用dofile,因爲我將所有這些包裝到一個加載/解析腳本一次並運行多次的對象中。這使我可以避免每次需要運行時加載腳本。 – Virus721

+0

@ Virus721不用編寫自己的解決方案,可以考慮使用'require'函數,並通過'package.path'和/或'package.loaders'配置它。 –

0

luaL_loadfile離開編譯腳本作爲堆棧上的功能。

因此,SomeScript.lua的功能位於頂部,HelloWorldAPI.lua的功能位於其下方。

+0

感謝您的幫助。 – Virus721

相關問題