使用Luabind创建Lua范围类
2015-9-24 8:47:33
收藏:0
阅读:71
评论:2
我知道可以使用 Luabind 提供给 Lua 的面向对象系统来创建 Lua 类:
http://www.rasterbar.com/products/luabind/docs.html#defining-classes-in-lua
class 'lua_testclass'
function lua_testclass:__init(name)
self.name = name
end
function lua_testclass:print()
print(self.name)
end
a = lua_testclass('example')
a:print()
然而,我无法弄清如何在另一个命名空间中设置类,以便可以执行以下操作:
a = MyScope.lua_testclass('example')
a:print()
有人有想法吗?我不希望我的类污染 Lua 的全局命名空间。
点赞
用户6367853
我做得有些不同,但基本上是相同的概念。我的实现不是创建类,而是移动类。我也在 C++ 侧实现了它。
要在 Lua 中实现我所做的,你需要写:
function moveClass(name)
oldGlobal = _G[name]
_G[name] = nil
return oldGlobal
end
要在 C++ 中实现它,你需要写:
luabind::module(lua) [
luabind::def("moveClass", +[](lua_State * lua, std::string name) {
// 在类不存在的情况下,这将只是删除 nil 并返回 nil。这基本上没有任何作用。
luabind::object oldGlobal = luabind::globals(lua)[name];
luabind::globals(lua)[name] = luabind::nil;
return oldGlobal;
})
];
现在如果你要使用它来移动一个你创建的类,你会这样做:
class 'MyClass'
myTable = {}
myTable.MyClass = moveClass 'MyClass'
另外需要注意的是,如果你希望 moveClass 函数在你尝试移动类不存在的情况下报错,可以使用 luabind::type(oldGlobal) == LUA_TNIL 来判断此类是否存在。
示例:
luabind::module(lua) [
luabind::def("moveClass", +[](lua_State * lua, std::string name) {
luabind::object oldGlobal = luabind::globals(lua)[name];
if (luabind::type(oldGlobal) == LUA_TNIL) {
throw std::runtime_error("Class does not exist.");
}
luabind::globals(lua)[name] = luabind::nil;
return oldGlobal;
})
];
2017-06-24 15:09:19
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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中获取用户配置主目录的跨平台方法
Luabind的
class函数将始终污染全局表。但是,您可以在其后进行清理:function newclass(name) oldglobal = _G[name] class(name) cls = _G[name] _G[name] = oldglobal return cls end然后您可以像这样使用它:
MyScope.lua_testclass = newclass 'lua_testclass'类似于
local mod = require 'mod',您必须两次拼写类的名字,但是您可以轻松地在此基础上构建另一个函数,例如setclass(MyScope,'lua_testclass'),自动将类放入MyScope:function setclass(scope,name) scope[name] = newclass(name) end免责声明:所有这些代码都没有经过测试。