初学者 LuaPlus 元表问题

我是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”和“MultiObjectMetaTable”将成为全局Lua变量?

原文链接 https://stackoverflow.com/questions/7247284

点赞
stackoverflow用户63791
stackoverflow用户63791

这不是标准的 Lua,看起来你正在使用一个我不熟悉的 C++ 包装器,但我可以猜测一些东西

在第一行,我们创建了一个新的表,在第二行有点令人困惑。在我们刚刚创建的这个表中,我们将键为 __index 的元素设置为表本身。为什么选择 __index 做为键?为什么把表本身设置为表的一个元素?

__index 是使用元表时的特殊键。如果有一个表t,我试图使用 foo 作为键索引它时,通常我会得到与该键对应的值。但如果没有这样的键,通常情况下会返回 nil

但是如果在元表中有特殊键 __index,就不会返回 nil!如果一个元表有一个 __index 函数或表,它会使用它来找到你需要的值。如果你在这里分配了一个表到 __index 中,它会查找那个表并返回你提供的键的值。这允许你获得类似继承的行为,即如果表t没有这个值,就默认使用另一个表中的值。

但对于最后一行,那只是创建一个名为“obj1”的全局Lua变量吗?此时“obj1”和“MultiObjectMetaTable”将成为全局Lua变量吗?

正如我所提到的,这不是标准的Lua,所以我不太确定发生了什么。(混合使用C++和Lua可能变得麻烦,因此在学习Lua时最好使用C接口,这样您就可以真正理解发生了什么。一旦了解了这一点,您可以转向更自动化的解决方案)

2011-08-30 17:39:31