初学者LuaPlus元表问题

Beginner LuaPlus Metatables Question

本文关键字:问题 LuaPlus 初学者      更新时间:2023-10-16

我是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接口,这样你就能理解到底发生了什么。一旦您理解了这一点,您就可以转向更自动化的解决方案)