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

4

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

我想为运行脚本设置一个“环境”,以便某些变量对所有脚本都可用。

例如,我想将只读对象Foo和FooBar暴露给脚本,以便Foo和FooBar在所有运行的脚本中都可用。

有人知道我该如何实现这一点吗?一个展示如何实现的代码片段会非常有用。

2个回答

2

我没有听说过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.cpp和demo_stub.hpp文件:
$ tolua++5.1 -o demo_stub.cpp -H demo_stub.hpp demo.pkg

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

#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

@autonakos:感谢您提供的代码。它肯定会帮助我走上正确的道路(我还需要进行更多的实验)。 - skyeagle

0

lua_setglobal

至于“只读”,您是指Foo不能被覆盖(例如Foo = 10),还是指Foo的值反转不能被修改(例如Foo.x = 10)?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接