初学者LuaPlus元表问题
Beginner LuaPlus Metatables Question
我是Lua/LuaPlus的新手,试图弄清楚元表是如何工作的。
以下代码摘自手册:
LuaObject metaTableObj = state->GetGlobals().CreateTable("MultiObjectMetaTable");
metaTableObj.SetObject("__index", metaTableObj);
metaTableObj.RegisterObjectFunctor("Print", &MultiObject::Print);
在第一行中,我们创建了一个新表,但是第二行有点令人困惑。在我们刚刚创建的这个表中,我们设置键为__index的元素等于表本身。为什么__index被选为键,为什么设置表的元素等于表本身?
然后在下一段代码中:
MultiObject obj1(10);
LuaObject obj1Obj = state->BoxPointer(&obj1);
obj1Obj.SetMetaTable(metaTableObj);
state->GetGlobals().SetObject("obj1", obj1Obj);
我们创建了一个c++对象,通过BoxPointer调用将其地址与LuaObject关联起来,并设置元表,以便我们可以使用Print函数。
但是对于最后一行,是否只是创建一个名为"obj1"的全局Lua变量?在这一点上"obj1"answers"MultiObjectMetaTable"将是全局Lua变量?
这不是标准的Lua,看起来你在使用一些我不熟悉的c++包装器,但我可以做一些猜测
在第一行中,我们创建了一个新表,但第二行是一个小困惑。在我们刚刚创建的这个表中,我们正在设置键__index等于表本身的元素。为什么__index选择作为键,为什么将表的元素设置为等于表本身?
__index
是使用元表时的一个特殊键。如果我有一个表t
,我尝试用键foo
索引它,例如,很自然地,我将得到与该键相关的值。假设这里什么都没有。通常,如果您尝试索引到一个没有任何内容的位置,您将返回nil
。
但是如果你有一个包含特殊键__index
的元表,那就不是这样了!如果您有一个包含__index
函数或表的元表,它将使用它来找到您的值。如果你有一个表赋值给__index,就像你在这里做的那样,它会查找那个表并返回你提供的键处的值。这允许您获得类似继承的行为。例如,如果表t没有此值,则默认为另一个表中的值。
But for the last line, is that just creating a global Lua variable called "obj1"? At this point "obj1" and "MultiObjectMetaTable" will be global Lua variables?
正如我提到的,这不是标准的Lua,所以我不完全确定那里发生了什么。(混合c++和Lua可能会很棘手,所以当你还在学习Lua时,最好还是坚持使用C接口,这样你就能理解到底发生了什么。一旦您理解了这一点,您就可以转向更自动化的解决方案)
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 初学者LuaPlus元表问题