我在一个C应用程序中嵌入了一个Lua解释器.
我想为运行脚本设置一个“环境”,以便某些变量可供所有脚本使用.
例如,我想将READ ONLY对象Foo和FooBar暴露给脚本,这样Foo和FooBar可用于所有正在运行的脚本.
有谁知道我怎么做到这一点?一个代码片段,展示如何做到这一点非常有用.
最佳答案 我没有听说过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解释器:
#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