- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是 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变量吗?
最佳答案
这不是标准的 Lua,看起来你正在使用一些我不熟悉的 C++ 包装器,但我可以做出一些猜测
In the first line we create a new table, but the second line is a little confusing. In this table we just created, we are setting the element with key __index equal to the table itself. Why is __index chosen as a key and why set an element of the table to be equal to the table itself?
__index
是使用元表时的特殊键。例如,如果我有一个表 t
并尝试使用 foo
键对其进行索引,自然地,我将取回与该键关联的值。但是可以说那里什么都没有。通常,如果您尝试索引到一个什么都没有的位置,您将返回 nil
。
但如果你有一个包含特殊键 __index
的元表,那就不行了!如果您有一个带有 __index
函数或表的元表,它将使用它来找到您的值。如果您像此处一样将表分配给 __index ,它将查看该表并返回您提供的键的值。这允许您获得类似继承的行为。即,如果表 t 没有此值,则默认为其他表中的值。
但对于最后一行,是否只是创建一个名为“obj1”的全局 Lua 变量?此时“obj1”和“MultiObjectMetaTable”会是全局Lua变量吗?
正如我提到的,这不是标准的 Lua,所以我不完全确定那里发生了什么。 (虽然混合使用 C++ 和 Lua 可能会很棘手,所以当您仍在学习 Lua 时,最好坚持使用 C 接口(interface),这样您就可以了解真正发生的事情。一旦您了解了,您就可以转向更自动化的解决方案)
关于c++ - 初学者 LuaPlus 元表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7247284/
我想要一个函数在被 Lua 脚本调用时返回一个(键-值-)表。因此,我必须将表插入堆栈。 我知道如何将整数压入堆栈:state->PushInteger(10) 我也知道它如何处理字符串和其他数字,但
我想知道如何从 C++ 端创建和注册一个函数,该函数在从 Lua 端调用时返回一个表。 我尝试了很多东西,但没有任何效果。 :/ (抱歉代码太长)这例如是行不通的,因为 Register() 需要一个
我有一个关于使用 LuaPlus 的初学者问题。 我正在查看对象构造函数中的一些代码: m_MetaTable = g_pApp->m_pLuaStateManager->GetGlobalState
我找到了一个很好的教程,介绍如何使用 Visual Studio 2010 将 LuaPlus 实现到 C++ 项目中。 http://www.zynox.net/luaplus-1-compilin
我是 Lua/LuaPlus 的新手,正在尝试了解元表的工作原理。 在摘自手册的这段代码中: LuaObject metaTableObj = state->GetGlobals().CreateTa
我从这里(http://luaplus.org/projects/luaplus/files) 下载了visual2008 文件,但我不知道如何将它添加到我的项目中。它不像其他库,我只需将 inclu
In this guide创建函数以将怪物添加到表中并减少表中怪物的生命值。 您可以从 lua 脚本中像这样轻松地使用这两个函数: monster = objectMgr:CreateObject("
我下载了 JamPlus(在花了相当长的时间后发现这是所需的特定 Jam 衍生物,但没有随下载一起提供),并按照指示设置我的 PATH 变量,但它不起作用。 具体来说,Jam 列出了一系列错误,例如无
如何创建这样的 Lua 对象: players = { { pos = {x=12.43,y=6.91}, backpack = {22,54},
我一直在使用 LuaPlus 来使用脚本语言公开模块的功能。为此,LuaPlus 真的很棒,但我坚持清理我的暴露对象,因为我不知道如何处理删除代表我的 c++ 对象的 lua 对象,所以我可以正确释放
我的 Lua 脚本中有一种回调函数,我想从 C++ 端的不同线程调用它(每秒 0-100 次)。到目前为止,它基本上可以工作,但是一旦我在很短的时间内多次调用它,它就会使程序崩溃,从而导致错误,例如:
我目前正在使用 LuaPlus 开发一个项目,我需要能够使用 GUID,但似乎无法在 lua 中找到它们。当我为 lua 构建数据时,没有 setGUID,有设置数字、设置字符串等。还有一个 Set(
我想使用 LUAPlus 将 Lua 表函数链接到 C++ 变量。到目前为止,使用我可以在网上找到的信息,我已经设法使用 DoString("tableName:functionName") 调用了一
我是一名优秀的程序员,十分优秀!