【问题标题】:Load a Lua script into a table named after filename将 Lua 脚本加载到以文件名命名的表中
【发布时间】:2011-02-13 05:01:11
【问题描述】:

我使用luaL_loadfile 加载脚本,然后从我的游戏中使用lua_pcall,我想知道是否可以将它们加载到以文件名命名的表中,而不是将它们加载到全局表中?

例如:

我有一个名为“Foo.lua”的文件,其中包含:

function DoSomething()
    --something
end

加载后我希望能够像这样访问它:

Foo.DoSomething()

谢谢!

【问题讨论】:

    标签: c# c++ c lua


    【解决方案1】:

    试试这样的。不要忘记添加错误检查...

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

    【讨论】:

    • 在此之后我是否必须重新设置环境?因为当我尝试调用在此之后注册的函数时,我得到:“尝试调用全局 'print' (a nil value)”
    • 哦,对了。我给出的代码用一个空表替换了该脚本的全局变量,并且它没有打印。我看到了两种解决方案:向指向 _G 的表添加一个 __index 元方法,或者在 lua_pcall 之前临时向 _G 添加一个 __newindex 方法,以便脚本中的所有定义都进入您的表。我建议您先使用 Lua 进行原型制作,然后再使用 C。
    • 更详细的解释(用Lua写的)可以在lua-users mailing list上找到
    【解决方案2】:

    它们的去向由 Lua 代码本身决定 - 如果文件在全局命名空间中声明它,那么当您通过 pcall 运行文件时,它将进入全局命名空间。

    最简单的选择是鼓励编写 Lua 文件的人创建自己的命名空间(文件开头只是 Foo = {},然后将函数声明为 Foo.whatever)。

    如果你想强制把东西放到一个私有的命名空间中,你不得不让事情变得复杂一些——基本上,在运行文件后找到全局命名空间中发生的变化并手动移动新的项目改为私有命名空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 2014-08-05
      • 1970-01-01
      • 2019-06-04
      • 2016-12-30
      相关资源
      最近更新 更多