问题标签 [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.

0 投票
2 回答
1282 浏览

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 的“步骤指针”......我根本不知道为什么。

请帮忙......我搞砸了这么多是什么?

谢谢你,很抱歉这篇长文......我只是不知道如何让它更短。

0 投票
1 回答
1455 浏览

lua - setmetatable() 是如何工作的以及为什么在 lua 的链表中需要元表

我正在学习 Lua 的元表如何在 OOP 中工作,我对从 lua-users wiki 上的面向对象教程中阅读的代码感到困惑。有人可以帮助解释以下问题吗?谢谢。

问题1:wiki的解释:这里我们在类表中添加一个元表,该元表有__call元方法,当一个值像函数一样被调用时触发。我们让它调用类的构造函数,所以创建实例时不需要 .new 。

(1)示例中的__call是如何被调用的,所以构造函数被调用了?
(2)“cls”是指“MyClass”吗?

问题 2:以下代码中的 {} 指的是什么?

**这里是完整的代码:

0 投票
1 回答
443 浏览

lua - 使用“。”的困惑 Lua 中带有 __index 和命名空间的符号

我对使用“。”的以下两种语法感到困惑。

  1. 据我了解,__index当键不存在于表中但存在于其元表中时调用。那么为什么列表表调用__index然后将自身分配给list.__index

    /li>
  2. 是否Window.mt只是创建一个表?为什么我们需要Window = {}在这里作为命名空间?

    /li>
0 投票
1 回答
875 浏览

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 获得所需的参数?

从教程中获取的代码:

0 投票
1 回答
2617 浏览

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

0 投票
1 回答
678 浏览

loops - 如何循环遍历 Corona 中的表格?

今天我在使用 LÖVE 一段时间后遇到了 Corona SDK。我偶然发现了一个我似乎无法解决的问题。子弹确实会生成,但它们仍然一动不动。是否有另一种方法可以更新每个 Bullet,或者我做错了什么?

在 LÖVE 中,我可以使用以下方法更新每个 Bullet:

0 投票
1 回答
365 浏览

lua - Lua metatable,如何转发未定义的函数?

我有一个空表,我想将它作为另一个位置的另一组函数的“网关”。

我想将此表中的调用函数作为字符串传递到其他地方:

我已经尝试过,但成功有限。

如何通过表转发未定义的函数而不会引发错误?

编辑:更多细节

我试图在一次调用中定义和调用表中的函数:

此代码确实有效,但第一个 pcall 将引发错误,因为尚未定义该函数。

假设我想使用一个我知道更新很多的库并保持我的脚本兼容,并且这个库可能不存在于我的计算机上。我想通过某个接口转发对该库的调用,但我仍然希望能够以相同的方式调用这些函数。

这可能吗?

编辑2:

谢谢@greatwolf!

这是我的工作测试代码。

0 投票
2 回答
396 浏览

lua - lua:如何让 getmetatable() 返回 nil?

我在 C 中创建了一个用户对象,作为其中的一部分,我创建了一个元表来覆盖诸如__tostring__index等方法。不过,我注意到可以通过getmetatable(). 如果我的元表有键,似乎可以getmetatable()返回任意表。__metatable我想getmetatable()返回nil,所以我的第一个想法是添加一个__metatablenil,但这显然不起作用,因为它实际上并没有将__metatable键添加到元表:

这可以以某种方式完成,还是我必须坚持把一张空桌子塞进去__metatable

0 投票
0 回答
1320 浏览

c++ - Lua 为 C++ 设置元表函数

我发现了两种实现元表函数的代码。我不太了解第一个,与第二个有什么区别。

首先:

第二个(更清楚):

他们不做同样的工作,但这是单向编程的问题。

0 投票
1 回答
3254 浏览

function - Lua 字符串追加

所以我创建了一个所有字符串都可以使用的函数,它被称为 append。

然后像这样使用该函数:

有没有办法创建一个函数来做到这一点:

并生产