问题标签 [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.
oop - 在 Lua 中为新对象指定元表
方法/1
方法/2
大多数时候我看到人们使用这种self.__index = self
方法,对我来说这似乎很笨拙。Dog
为什么要使用不构成元表的所有附加方法传递整个对象setmetatable
?Method/1适合将新对象设置为metatable.__index
对象Dog
,它也更干净。
是否有充分的理由使用Method/2而不是Method/1?
一些额外的代码来提供上下文,它适用于这两种方法
arrays - Lua如何从表中获取数据
我有一张桌子:
如何获取表的键和值?
我试图得到:
但它不起作用。
lua - 修改lua中的#操作符
我在love2d引擎上做了一个无关紧要的lua控制台。我正在尝试升级元表以能够影响更多的东西(配对功能,在另一个表上更改元表而不是目标表等),我正在制作的插件之一是__changeindex
当您修改现有的时的一个事件指数。
为了做到这一点,我必须给用户一个不包含任何值的虚拟表,当他们尝试添加一些东西时,检查它是否已经在真实表中定义,如果它是那么 call __changeindex
,如果不是那么 call __newindex
。这可以完美运行,但是这会导致许多其他 Lua 表函数停止工作(对于循环/getmetatable/setmetatable)。我已经为大多数这些问题制定了解决方法,它们工作正常,但我无法让#t 运算符工作,我想说
然后#t2 应该真的返回#t1。我有什么办法可以做到这一点吗?
我现有的代码可以在这里找到
编辑:这是我的第一篇文章,所以如果我没有完全遵守发布规则,我深表歉意,我试过了 :) 如果有人有办法让假表和真表垃圾收集,我将不胜感激
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.
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?
lua - 访问时Lua中元表的时间复杂度
访问的时间复杂度是多少ins.base
?
lua - 在 Lua 元表中同时指定“方法”和索引运算符
我需要 userdata 对象来支持方法和索引运算符(带有整数索引)。有没有办法在一个常见的元表中实现这一点,而无需通过函数模拟方法?
我尝试通过将metatable(object).__index
实际方法设置为表以及metatable(metatable(object).__index).__index
实现索引运算符的函数来链接元表。但是,该函数是使用第一个__index
表作为参数调用的,而不是原始对象。__index
这似乎是一个设计疏忽,因为当元方法是一个函数时传递原始对象更有意义。无论如何,有没有办法在不显式检查函数中的方法名称的情况下实现我想要的__index
?
lua - Lua 元表:类字段与实例字段
我正在用 Corona/Lua 开发一个游戏,并实现一个名为“Item”的类,它代表游戏中的武器、盔甲、护身符等。而且我是面向对象的 Lua 新手。
创建类的新实例后,我发现设置对象的某些属性似乎将它们设置在类元表中,而不是在对象本身中。
这是类和构造函数:
现在假设我基于这个原型创建了两个对象:
令我沮丧的是,“bonuses.damageBonus”属性似乎设置在元表中,因此适用于每个项目(即弓也获得伤害加成,并与戒指堆叠)。然而,这种行为似乎仅限于“奖励”属性。如果我设置“itemType”属性,它会按预期附加到对象,而不是类。
我希望看到的行为是可以为单个项目设置“奖金”表的字段。知道我做错了什么吗?谢谢!
lua - lua __pairs 的实际实现是什么?
有人知道 lua 5.2 的实际实现吗?元方法__pairs
?换句话说,我如何__pairs
在元表中实现元方法,以便它与 完全相同pairs()
?
我需要覆盖__pairs
并希望跳过我在表中添加的一些虚拟变量。
lua - Lua:按名称解释未定义的变量
我有一个函数foo
可以在某些情况下获取 nil 值,即foo(VarA)
whileVarA
未定义。这个 undefinedVarA
应该被解释为"VarA"
但我不能调用foo("VarA")
,因为VarA
它应该作为一个选项参数(不同于普通的字符串参数)。
这将获得所需的结果,但现在所有其他未定义的变量都将返回其名称。喜欢abc -> "abc"
。您是否看到在这种特定情况下仅激活元表的任何方法?我可以在我的方法中切换元表,foo
但是当我在foo
块中时,传递的参数已经为零并且为时已晚。
附录:我认为这个问题不够具体。Schollii 将参数作为表格传递的答案很好,但没有按预期工作:
这应该有键信息(选项 1 和选项 2)加上值的信息(即使删除和推送在全局或本地命名空间中不存在)。Schollii 的方法会给我关键信息而不是价值信息(如“删除”和“推送”)。我不能预先定义删除和推送,因为这些新的“关键字”应该稍后由函数本身定义。将这些新关键字作为字符串传递是没有选择的。