我從我的遊戲中使用luaL_loadfile
然後lua_pcall
加載腳本,並想知道是否將它們加載到全局表中,而不是將它們加載到以文件名命名的表中?將Lua腳本加載到以文件名命名的表中
例如:
我有我的文件名爲 「Foo.lua」,其中包含此:
function DoSomething()
--something
end
加載它後,我希望能夠訪問它想:
Foo.DoSomething()
謝謝!
我從我的遊戲中使用luaL_loadfile
然後lua_pcall
加載腳本,並想知道是否將它們加載到全局表中,而不是將它們加載到以文件名命名的表中?將Lua腳本加載到以文件名命名的表中
例如:
我有我的文件名爲 「Foo.lua」,其中包含此:
function DoSomething()
--something
end
加載它後,我希望能夠訪問它想:
Foo.DoSomething()
謝謝!
嘗試這樣的事情。不要忘記添加錯誤檢查...
lua_newtable(L);
lua_setglobal(L,filename);
luaL_loadfile(L,filename);
lua_getglobal(L,filename);
lua_setfenv(L,-2);
lua_pcall(L,...);
他們去的地方是由Lua代碼本身決定的 - 如果文件在全局名稱空間中聲明它,它會在通過pcall運行文件時進入全局名稱空間。
最簡單的選擇是鼓勵正在編寫Lua文件的人創建他們自己的命名空間(在文件的開頭只是一個Foo = {}
,然後再聲明函數爲Foo.whatever)。
如果你想強制事情到一個私人的命名空間,你必須有點複雜 - 基本上,找到在運行文件後手動將新項目移動到私人命名空間。
是否必須在此之後設置環境?因爲當我嘗試調用我在此之後註冊的函數時:「嘗試調用全局'打印'(一個零值)」 – 2010-04-29 01:01:51
哦,對。我給出的代碼用空表替換了該腳本的全局變量,並且沒有打印。我看到了兩種解決方案:在_G指向_G的表中添加一個__index元方法,或者在lua_pcall之前臨時向_G添加__newindex方法,以便腳本中的所有定義都會到您的表中。我建議你首先使用Lua原型,然後移到C. – lhf 2010-04-29 01:27:01
可以在[lua-users郵件列表](http://lua-users.org/lists/lua)上找到更詳細的解釋(用Lua編寫) -l/2006-05/msg00121.html) – akciom 2013-02-21 21:16:32