为嵌入式Lua脚本设置“环境”
2010-12-19 10:24:13
收藏:0
阅读:142
评论:2
我正在将 Lua 解释器嵌入到 C++ 应用程序中。
我想设置一个'环境'来运行脚本,以便某些变量对于所有脚本都是可用的。
例如,我想向脚本公开只读对象 Foo 和 FooBar,以便 Foo 和 FooBar 对于所有运行中的脚本都是可用的。
有人知道我如何做吗?一个片段来展示如何实现这个目标会非常有用。
原文链接 https://stackoverflow.com/questions/4482518
点赞
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.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;
}
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
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
关于“只读”,您指的是Foo不可被覆写(例如
Foo=10
),还是Foo反向的值是不可变的(例如Foo.x=10
)?lua_setglobal
.