建立一个';环境';对于嵌入式Lua脚本 我在一个C++应用程序中嵌入了一个LUA解释器。

建立一个';环境';对于嵌入式Lua脚本 我在一个C++应用程序中嵌入了一个LUA解释器。,c++,scripting,lua,C++,Scripting,Lua,我想为运行脚本设置一个“环境”,这样所有脚本都可以使用某些变量 例如,我想向脚本公开只读对象Foo和FooBar,这样所有正在运行的脚本都可以使用Foo和FooBar 有人知道我怎么做吗?。一个演示如何实现这一点的代码片段将非常有用。 至于“只读”,你是说Foo不会被覆盖(例如,Foo=10),还是说Foo reverse的值是不可变的(例如,Foo.x=10) 如果C++应用程序很大,你可能想使用一个工具来生成一个你可以从Lua调用的接口。我过去很幸运地使用过tolua++: 假设代码> de

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

例如,我想向脚本公开只读对象Foo和FooBar,这样所有正在运行的脚本都可以使用Foo和FooBar

有人知道我怎么做吗?。一个演示如何实现这一点的代码片段将非常有用。


至于“只读”,你是说Foo不会被覆盖(例如,
Foo=10
),还是说Foo reverse的值是不可变的(例如,
Foo.x=10

如果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
是加载
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;
}
构造一个
demo.lua
脚本

print("Hello, world!")
print(tolua.type(demo.getFoo()))
print(demo.getFoo():getX())
并将脚本提供给解释器:

$ ./demo < demo.lua
Hello, world!
demo::Foo
42
$。/demo
@autonakos:谢谢你的代码。这肯定会帮助我走上正确的道路(我还需要更多的实验)。
$ ./demo < demo.lua
Hello, world!
demo::Foo
42