【发布时间】:2011-02-13 05:01:11
【问题描述】:
我使用luaL_loadfile 加载脚本,然后从我的游戏中使用lua_pcall,我想知道是否可以将它们加载到以文件名命名的表中,而不是将它们加载到全局表中?
例如:
我有一个名为“Foo.lua”的文件,其中包含:
function DoSomething()
--something
end
加载后我希望能够像这样访问它:
Foo.DoSomething()
谢谢!
【问题讨论】:
我使用luaL_loadfile 加载脚本,然后从我的游戏中使用lua_pcall,我想知道是否可以将它们加载到以文件名命名的表中,而不是将它们加载到全局表中?
例如:
我有一个名为“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)。
如果你想强制把东西放到一个私有的命名空间中,你不得不让事情变得复杂一些——基本上,在运行文件后找到全局命名空间中发生的变化并手动移动新的项目改为私有命名空间。
【讨论】: