问题标签 [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 投票
3 回答
267 浏览

oop - 在 Lua 中为新对象指定元表

方法/1

方法/2

大多数时候我看到人们使用这种self.__index = self方法,对我来说这似乎很笨拙。Dog为什么要使用不构成元表的所有附加方法传递整个对象setmetatableMethod/1适合将新对象设置为metatable.__index对象Dog,它也更干净。

是否有充分的理由使用Method/2而不是Method/1


一些额外的代码来提供上下文,它适用于这两种方法

0 投票
1 回答
2840 浏览

arrays - Lua如何从表中获取数据

我有一张桌子:

如何获取表的键和值?

我试图得到:

但它不起作用。

0 投票
1 回答
406 浏览

lua - 修改lua中的#操作符

我在love2d引擎上做了一个无关紧要的lua控制台。我正在尝试升级元表以能够影响更多的东西(配对功能,在另一个表上更改元表而不是目标表等),我正在制作的插件之一是__changeindex当您修改现有的时的一个事件指数。

为了做到这一点,我必须给用户一个不包含任何值的虚拟表,当他们尝试添加一些东西时,检查它是否已经在真实表中定义,如果它是那么 call __changeindex,如果不是那么 call __newindex。这可以完美运行,但是这会导致许多其他 Lua 表函数停止工作(对于循环/getmetatable/setmetatable)。我已经为大多数这些问题制定了解决方法,它们工作正常,但我无法让#t 运算符工作,我想说

然后#t2 应该真的返回#t1。我有什么办法可以做到这一点吗?

我现有的代码可以在这里找到

编辑:这是我的第一篇文章,所以如果我没有完全遵守发布规则,我深表歉意,我试过了 :) 如果有人有办法让假表和真表垃圾收集,我将不胜感激

0 投票
2 回答
421 浏览

lua - Compare a value with a table by using metatables in Lua

I'm looking for a way in Lua 5.1 to compare with metatables, so I can compare any value with a table. If that value is in the table it returns true, and false if it is not in the table. like the following.

I know that the __eq is used, but the reference manual stats something about making sure that the 2 be the same type and have the same __eq function. To do this I would need to overcome that limitation and I do not know how, or even if it is even possible.

0 投票
2 回答
1071 浏览

lua - Lua override # for strings

I'm trying to imlement my own length method for strings in Lua. I have successfully overriden len() method for string, but I have no idea how to do this for # operator.

If I call:

It outputs:

But

Outputs only '3' and that means it called original length function instead of mine. Is there a way to make # call my length function?

0 投票
1 回答
797 浏览

lua - 访问时Lua中元表的时间复杂度

访问的时间复杂度是多少ins.base

0 投票
2 回答
298 浏览

lua - 在 Lua 元表中同时指定“方法”和索引运算符

我需要 userdata 对象来支持方法和索引运算符(带有整数索引)。有没有办法在一个常见的元表中实现这一点,而无需通过函数模拟方法?

我尝试通过将metatable(object).__index实际方法设置为表以及metatable(metatable(object).__index).__index实现索引运算符的函数来链接元表。但是,该函数是使用第一个__index表作为参数调用的,而不是原始对象。__index这似乎是一个设计疏忽,因为当元方法是一个函数时传递原始对象更有意义。无论如何,有没有办法在不显式检查函数中的方法名称的情况下实现我想要的__index

0 投票
2 回答
374 浏览

lua - Lua 元表:类字段与实例字段

我正在用 Corona/Lua 开发一个游戏,并实现一个名为“Item”的类,它代表游戏中的武器、盔甲、护身符等。而且我是面向对象的 Lua 新手。

创建类的新实例后,我发现设置对象的某些属性似乎将它们设置在类元表中,而不是在对象本身中。

这是类和构造函数:

现在假设我基于这个原型创建了两个对象:

令我沮丧的是,“bonuses.damageBonus”属性似乎设置在元表中,因此适用于每个项目(即弓也获得伤害加成,并与戒指堆叠)。然而,这种行为似乎仅限于“奖励”属性。如果我设置“itemType”属性,它会按预期附加到对象,而不是类。

我希望看到的行为是可以为单个项目设置“奖金”表的字段。知道我做错了什么吗?谢谢!

0 投票
2 回答
4806 浏览

lua - lua __pairs 的实际实现是什么?

有人知道 lua 5.2 的实际实现吗?元方法__pairs?换句话说,我如何__pairs在元表中实现元方法,以便它与 完全相同pairs()

我需要覆盖__pairs并希望跳过我在表中添加的一些虚拟变量。

0 投票
2 回答
785 浏览

lua - Lua:按名称解释未定义的变量

我有一个函数foo可以在某些情况下获取 nil 值,即foo(VarA)whileVarA未定义。这个 undefinedVarA应该被解释为"VarA"但我不能调用foo("VarA"),因为VarA它应该作为一个选项参数(不同于普通的字符串参数)。

这将获得所需的结果,但现在所有其他未定义的变量都将返回其名称。喜欢abc -> "abc"。您是否看到在这种特定情况下仅激活元表的任何方法?我可以在我的方法中切换元表,foo但是当我在foo块中时,传递的参数已经为零并且为时已晚。

附录:我认为这个问题不够具体。Schollii 将参数作为表格传递的答案很好,但没有按预期工作:

这应该有键信息(选项 1 和选项 2)加上值的信息(即使删除和推送在全局或本地命名空间中不存在)。Schollii 的方法会给我关键信息而不是价值信息(如“删除”和“推送”)。我不能预先定义删除和推送,因为这些新的“关键字”应该稍后由函数本身定义。将这些新关键字作为字符串传递是没有选择的。