2010-04-28 97 views
2

我從我的遊戲中使用luaL_loadfile然後lua_pcall加載腳本,並想知道是否將它們加載到全局表中,而不是將它們加載到以文件名命名的表中?將Lua腳本加載到以文件名命名的表中

例如:

我有我的文件名爲 「Foo.lua」,其中包含此:

function DoSomething() 
    --something 
end 

加載它後,我希望能夠訪問它想:

Foo.DoSomething() 

謝謝!

回答

6

嘗試這樣的事情。不要忘記添加錯誤檢查...

lua_newtable(L); 
lua_setglobal(L,filename); 
luaL_loadfile(L,filename); 
lua_getglobal(L,filename); 
lua_setfenv(L,-2); 
lua_pcall(L,...); 
+0

是否必須在此之後設置環境?因爲當我嘗試調用我在此之後註冊的函數時:「嘗試調用全局'打印'(一個零值)」 – 2010-04-29 01:01:51

+0

哦,對。我給出的代碼用空表替換了該腳本的全局變量,並且沒有打印。我看到了兩種解決方案:在_G指向_G的表中添加一個__index元方法,或者在lua_pcall之前臨時向_G添加__newindex方法,以便腳本中的所有定義都會到您的表中。我建議你首先使用Lua原型,然後移到C. – lhf 2010-04-29 01:27:01

+0

可以在[lua-users郵件列表](http://lua-users.org/lists/lua)上找到更詳細的解釋(用Lua編寫) -l/2006-05/msg00121.html) – akciom 2013-02-21 21:16:32

4

他們去的地方是由Lua代碼本身決定的 - 如果文件在全局名稱空間中聲明它,它會在通過pcall運行文件時進入全局名稱空間。

最簡單的選擇是鼓勵正在編寫Lua文件的人創建他們自己的命名空間(在文件的開頭只是一個Foo = {},然後再聲明函數爲Foo.whatever)。

如果你想強制事情到一個私人的命名空間,你必須有點複雜 - 基本上,找到在運行文件後手動將新項目移動到私人命名空間。