问题标签 [metatable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Lua 5.2 - 对象内的 C++ 对象(使用 lua_lightuserdata)
编辑:[答案 2 中的解决方案]
我是 LUA 的新手,在尝试做我想做的事情时遇到了麻烦。我有一个看起来像这样的 C++ 对象:
C++ 对象定义
我希望能够在 LUA 中以下列形式访问 TMeasurement 类型的对象:
LUA 所需用途
...ETC
另一件事,我不希望 LUA 为 TMeasurement 类型的对象的实例分配内存。这将在我的 C++ 代码中完成。我尝试了很多不同的方法,都没有成功。我现在将发布我的最后一次尝试。
在我的 C++ 代码中,我定义了以下内容:
TLimit - 获取将映射到 __index 的函数
TLimit - 设置将映射到 __newindex 的函数
现在,TMeasurement 类又多了一个函数。(我不会在这个例子中提供成员“meas”的设置函数)。
TMeasurement - 获取 __index 的函数
现在,代码中为这两个对象创建元表的部分:
C++ - 发布元表
(不要介意 nsLUA::safeFunction<...> 位,它只是一个模板函数,它将以“安全模式”在 < > 中执行该函数......当出现错误时它会弹出一个 MessaegBox遭遇)
最后,我在 C++ 中的主要函数,初始化 LUA,创建对象 TMeasurement 和实例,将其作为全局传递给 LUA 并执行 lua 脚本。大部分功能都包含在另一个名为 LEngine 的类中:
C++ - 主函数
现在,终于有问题了。当我执行任何 lua 脚本时,我可以访问 step 没问题,但我只能在第一次访问“min”或“max”内的 memebr ......任何后续访问都会出错。
LUA - 示例一
此脚本生成的输出为:
所以。在我第一次访问字段“min”(或“max”)之后,任何后续访问它的尝试都将返回“尝试访问索引...”错误。我是先访问 __index (local e = step.min.enabled) 函数还是 __newindex 函数 (step.min.enabled = true) 都没有关系。
似乎我第一次访问对象步骤的 min metatble 时弄乱了 LUA 堆栈。它以某种方式“替换”了从 LUA_MEASUREMENT 元表到 LUA_MEAS_LIMIT 的“步骤指针”......我根本不知道为什么。
请帮忙......我搞砸了这么多是什么?
谢谢你,很抱歉这篇长文......我只是不知道如何让它更短。
lua - setmetatable() 是如何工作的以及为什么在 lua 的链表中需要元表
我正在学习 Lua 的元表如何在 OOP 中工作,我对从 lua-users wiki 上的面向对象教程中阅读的代码感到困惑。有人可以帮助解释以下问题吗?谢谢。
问题1:wiki的解释:这里我们在类表中添加一个元表,该元表有__call元方法,当一个值像函数一样被调用时触发。我们让它调用类的构造函数,所以创建实例时不需要 .new 。
(1)示例中的__call是如何被调用的,所以构造函数被调用了?
(2)“cls”是指“MyClass”吗?
问题 2:以下代码中的 {} 指的是什么?
**这里是完整的代码:
lua - 使用“。”的困惑 Lua 中带有 __index 和命名空间的符号
我对使用“。”的以下两种语法感到困惑。
据我了解,
/li>__index
当键不存在于表中但存在于其元表中时调用。那么为什么列表表调用__index
然后将自身分配给list.__index
?是否
/li>Window.mt
只是创建一个表?为什么我们需要Window = {}
在这里作为命名空间?
lua - 继承一个元表(类)并使用其所需的构造函数参数
我找到了这个教程: http: //lua-users.org/wiki/InheritanceTutorial
我有一个名为 Creature 的元表。Creature 在其构造函数中需要一个参数。必需的参数是表示名称的字符串。
- Creature 有很多其他方法,例如
getDescription()
. - Creature 的
getDescription ()
返回一个字符串:“这是一个生物”。 - 生物
getName ()
返回一个字符串:名称
我想创建一个名为的新元表(类)Player
并让它继承Creature
元表(类)
- Player 类将仅覆盖getDescription ()方法。
- Player 类也将继承 Creature 的 getName () 方法。
- Player 的getDescription()返回一个字符串:“ This is a player ”。
我希望能够做到以下几点:
应该打印:
这是一个生物
Bob
这是一个玩家
Joey
基本上,我的问题是 Creature 类需要一个参数来识别某人,一个名字。它的getName ()
函数使用参数中的值并打印它。如果我打算使用 Player 继承 Creature 的所有功能(并在必要时覆盖),我如何更改代码以确保 Player 获得所需的参数?
从教程中获取的代码:
c++ - Adding a userdata metatable to a lua table
I've got a scripting system working well using userdata objects. However, I now want to have a property on my userdata that can take a regular table.
I think what I should do is create a normal table and set the metatable to use my current set of metamethods, however I'm struggling to understand how to do this - I'm sure it's a simple tweak, I just can't see it right now.
My existing code looks like:
The __gc
metamethod is in there to delete the LuaWrapped::Ptr
class (which is a wrapper to a boost::shared_ptr
). I guess I'll leave that along, and store the pointer in a lightuserdata field on the normal table.
Experimental custom metatable against normal table issue (per discussion in comments):
Expected output on a get:
table, string
Actual output on a get (Lua 5.2, Ubuntu 14.04):
boolean, userdata
loops - 如何循环遍历 Corona 中的表格?
今天我在使用 LÖVE 一段时间后遇到了 Corona SDK。我偶然发现了一个我似乎无法解决的问题。子弹确实会生成,但它们仍然一动不动。是否有另一种方法可以更新每个 Bullet,或者我做错了什么?
在 LÖVE 中,我可以使用以下方法更新每个 Bullet:
lua - Lua metatable,如何转发未定义的函数?
我有一个空表,我想将它作为另一个位置的另一组函数的“网关”。
我想将此表中的调用函数作为字符串传递到其他地方:
我已经尝试过,但成功有限。
如何通过表转发未定义的函数而不会引发错误?
编辑:更多细节
我试图在一次调用中定义和调用表中的函数:
此代码确实有效,但第一个 pcall 将引发错误,因为尚未定义该函数。
假设我想使用一个我知道更新很多的库并保持我的脚本兼容,并且这个库可能不存在于我的计算机上。我想通过某个接口转发对该库的调用,但我仍然希望能够以相同的方式调用这些函数。
这可能吗?
编辑2:
谢谢@greatwolf!
这是我的工作测试代码。
lua - lua:如何让 getmetatable() 返回 nil?
我在 C 中创建了一个用户对象,作为其中的一部分,我创建了一个元表来覆盖诸如__tostring
、__index
等方法。不过,我注意到可以通过getmetatable()
. 如果我的元表有键,似乎可以getmetatable()
返回任意表。__metatable
我想getmetatable()
返回nil
,所以我的第一个想法是添加一个__metatable
键nil
,但这显然不起作用,因为它实际上并没有将__metatable
键添加到元表:
这可以以某种方式完成,还是我必须坚持把一张空桌子塞进去__metatable
?
c++ - Lua 为 C++ 设置元表函数
我发现了两种实现元表函数的代码。我不太了解第一个,与第二个有什么区别。
首先:
第二个(更清楚):
他们不做同样的工作,但这是单向编程的问题。
function - Lua 字符串追加
所以我创建了一个所有字符串都可以使用的函数,它被称为 append。
然后像这样使用该函数:
有没有办法创建一个函数来做到这一点:
并生产