初学者LuaPlus Metatables问题

时间:2011-08-30 17:27:55

标签: c++ lua

我是Lua / LuaPlus的新手,并试图找出metatables的工作原理。

在本手册中的代码中:

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相关联,并设置metatable以便我们可以使用Print函数。

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

1 个答案:

答案 0 :(得分:2)

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

  

在第一行我们创建一个新表,但第二行是a   有点混乱。在我们刚创建的这个表中,我们正在设置   键__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接口,这样你就能理解真正发生的事情。一旦你明白你可以转向更自动化的解决方案)< / p>