【问题标题】:Beginner LuaPlus Metatables QuestionLuaPlus 元表初学者问题
【发布时间】:2011-11-07 00:25:56
【问题描述】:

我是 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变量吗?

【问题讨论】:

标签: c++ lua


【解决方案1】:

这不是标准的 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 接口,这样你就可以了解真正发生的事情。一旦你了解了你可以继续使用更自动化的解决方案)

【讨论】:

  • 感谢您的信息。关于这个 __index 键,它只适用于元表。换句话说,如果你有一个标准的 Lua 表,它必须有一个带有 __index 键的关联元表才能工作。
  • 没错。特殊键以__开头,如__index__newindex__add等,它们只对元表有意义。
猜你喜欢
  • 2010-10-03
  • 2020-01-04
  • 2020-11-23
  • 2015-03-16
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多