为嵌入式Lua脚本设置“环境”

我正在将 Lua 解释器嵌入到 C++ 应用程序中。

我想设置一个'环境'来运行脚本,以便某些变量对于所有脚本都是可用的。

例如,我想向脚本公开只读对象 Foo 和 FooBar,以便 Foo 和 FooBar 对于所有运行中的脚本都是可用的。

有人知道我如何做吗?一个片段来展示如何实现这个目标会非常有用。

原文链接 https://stackoverflow.com/questions/4482518

点赞
stackoverflow用户501459
stackoverflow用户501459

关于“只读”,您指的是Foo不可被覆写(例如Foo=10),还是Foo反向的值是不可变的(例如Foo.x=10)?

lua_setglobal.

2010-12-19 22:08:45
stackoverflow用户513598
stackoverflow用户513598

我没有听说过 Lua 中的只读变量,但你可以通过使环境在函数调用中可用来防止修改。

如果 C++ 应用程序很大,你可能想使用工具生成一个可以从 Lua 中调用的接口。我以前使用过 tolua++,有些运气:

假设 demo.hpp 是 C++ 应用程序的头文件:

#ifndef SO_DEMO_HPP
#define SO_DEMO_HPP

namespace demo
{
    class Foo
    {
        double x;

    public:
        Foo(double x) : x(x) {}
        double getX() const { return x; }
    };

    Foo* getFoo();
}

#endif

demo.cpp 中实现 demo::getFoo()

demo.pkg 列出了应该从 Lua 中调用的事物:

$#include "demo.hpp"

namespace demo
{
    class Foo
    {
        double getX() const;
    };

    Foo* getFoo();
}

生成包含我们的 Lua 模块的 demo_stub.cppdemo_stub.hpp 文件:

$ tolua++5.1 -o demo_stub.cpp -H demo_stub.hpp demo.pkg

main.cpp 是一个加载 demo 模块的 Lua 解释器:

#include "demo.hpp"

extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <tolua++.h>
}
#include "demo_stub.hpp"

int main()
{
    lua_State *L = lua_open();

    luaL_openlibs(L);
    tolua_demo_open(L);

    if (luaL_dofile(L, NULL) != 0)
        fprintf(stderr, "%s\n", lua_tostring(L, -1));

    lua_close(L);
    return 0;
}

tolua_demo_open() 函数是由 tolua++ 生成的,并在 demo_stub.hpp 中声明。

构建名为 demo 的 Lua 解释器:

$ g++ -I/usr/include/lua5.1 demo.cpp demo_stub.cpp main.cpp -ltolua++5.1 -llua5.1 -o demo

构建一个 demo.lua 脚本

print("Hello, world!")
print(tolua.type(demo.getFoo()))
print(demo.getFoo():getX())

并将脚本提供给解释器:

$ ./demo < demo.lua
Hello, world!
demo::Foo
42
2010-12-20 00:46:19