问题标签 [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、c++ 和消失的元表
背景
我与 Watusimoto 合作开发游戏Bitfighter。我们使用 LuaWrapper 的变体将我们的 c++ 对象与游戏中的 Lua 对象连接起来。我们还使用 Lua 的一种变体,称为lua-vec来加速向量运算。
我们一直在努力解决一段时间以来一直困扰我们的错误。将发生随机崩溃,表明元表已损坏。请参阅此处了解 Watusimoto 关于该问题的帖子。我不确定这是因为元表损坏,并且看到了一些我想在这里问的非常奇怪的行为。
问题表现
例如,我们创建一个对象并将其添加到这样的级别:
但是,游戏有时(并非总是)会崩溃。出现错误:
使用在回答上述 Watusimoto 的帖子时给出的建议,我已将最后一行更改为以下内容:
这会打印出元表,以了解levelgen
从其中调用方法时出错的情况。
然而,这很疯狂,当它失败并打印出元表时,元表正是它应该的样子(通过正确的addItem
调用和一切)。如果我在脚本加载时打印元表levelgen
,并且当它使用pcall
上面失败时,它们是相同的,每个调用和指向 userdata 的指针都是相同的并且应该是相同的。
就好像元表levelgen
是随机地自发消失一样。
有人知道发生了什么吗?
谢谢
注意:这不仅仅发生在levelgen
对象上。例如,它也发生在TestItem
上面提到的对象上。实际上,相同的代码在我的计算机上levelgen:addItem(t)
崩溃了,但在另一个开发人员的计算机上崩溃了,t:setText("hello")
并且出现了相同的错误消息missing or unknown method 'setText' (a nil value)
lua - 如何防止我的可调用 Lua 表将自身作为参数传递给 __call?
假设我有以下代码:
而不是打印:
它打印:
表的 id 是 的t
。
我怎样才能让它表现得好像我print
直接打电话一样?
oop - Lua对象表在对象实例之间泄漏,但不是记录
我正在尝试学习 Lua,所以希望这是一个容易回答的问题。以下代码不起作用。变量 childContext 在类的所有实例之间泄漏。
查看面向对象的 lua 类泄漏,我可以通过将构造函数更改为:
所以我的问题是:
- 有没有一种更简洁的方式来声明类变量,就像第一个示例一样,所以我不必将它包含在构造函数中?
- 为什么 CxBR_Context.name 可以工作,而表 CxBR_Context.childContexts 却不行?
inheritance - 从不可变类型继承?
我刚刚回答了一个 Python 问题int
,该问题“需要”从(Python 中的不可变类型)继承一个类。我最近一直在做一些 Lua,当我回答这个问题时,我想;“这是如何在 Lua 中完成的?”
那么,我可以从 Lua 中的不可变类型继承一个类吗?如果是,如何?如果不能从整数等类继承,是否有其他方法可以实现类似于我对 Python 问题的回答中的行为?
作为旁注,我仍然很难理解 Lua 的元表。
lua - Lua 元表不一致
我无法理解为什么__index
这些示例之间的元方法的行为存在差异:
将引发以下错误:lua: l.lua:8: attempt to call method 'speak' (a nil value)
同时
将按预期执行,输出I'm an B
.
为了理解为什么会这样,我阅读了 PiL 的这一部分。它指出:
__index 元方法用于继承是如此普遍,以至于 Lua 提供了一个快捷方式。尽管有这个名字,__index 元方法不需要是一个函数:它可以是一个表,而是。当它是一个函数时,Lua 用表和缺失的键作为它的参数来调用它。当它是一个表时,Lua 会重做对该表的访问。
我对此的理解是,在涉及“A”的片段中,__index = A
导致在表中完成访问A
(根据上述引用的加粗部分)。如果是这种情况,我不明白为什么"speak"
找不到与密钥关联的功能。为了尝试解决这个问题,我决定在代码片段中实现函数方法,它返回与inB
关联的值,并且它起作用了。肯定和 (改编自)具有相同的效果。key
B
__index = A
B
__index = function(t,key) return A[key] end
任何澄清将不胜感激。
lua - 使用 Metatable 的方法时出错“尝试调用方法(零值)”
运行以下代码时出现错误“尝试调用方法 'Dot'(零值)”:
我不明白我做错了什么,谁能帮忙,我有很好的 Lua 经验,但刚刚开始学习如何使用元表,所以我现在是新手,我正在使用 SciTE 运行它,使用 LuaForWindows。错误在最后一行,但它上面的行完美运行
lua - 我需要澄清 Metatable.__index
我之前问过为什么 Lua 没有找到我的元表方法,并被告知通过设置__index
我的元表可以解决问题,所以我假设调用时的方法是通过元表中的索引搜索,但我现在遇到了一个问题,我需要在我的元表上使用索引括号[
,]
因此__index
被分配从其中的表中返回索引,我如何解决使用方法和使用的功能需求索引括号
我写了一个最小的例子来说明问题:
lua - 在 Lua 中更改元表会破坏冒号运算符
在学习 Lua 的过程中,我从这里借用了一些代码 来使用字符串索引,就是这样:
之后,我写了一个函数来反转一个字符串作为练习。
这工作正常,直到我将 更改string.len(str)
为str:len()
,然后我收到此错误:
调试 print() 告诉我该__index
函数正在被调用str:len()
,并且i
参数正在变成字符串“len”。我知道 str:len() 可以在没有元表的情况下工作,但是一旦我添加它就会发生这种情况,为什么?
lua - Hiding a Lua metatable and only exposing an object's attributes
How do you create a Lua object that only exposes its attributes and not its methods? For example:
Produces:
Also, is it possible to not use the colon syntax for OOP in Lua? I don't need inheritance, polymorphism, only encapsulation and privacy.
lua - 在 Lua 编程的第 108 页上对 Lua 元表感到困惑
我正在学习 Lua,使用的是Programming in Lua, first edition。我无法理解元表。
这是出现在第 108 页上的代码和解释:
为了帮助检查我们的示例,我们还定义了一个打印集合的函数:
现在,我们想让加法运算符 (
+
) 计算两个集合的并集。为此,我们将安排表示集合的所有表共享一个元表,该元表将定义它们如何对加法运算符作出反应。我们的第一步是创建一个常规表,我们将使用它作为集合的元表。为了避免污染我们的命名空间,我们将它存储在 Set 表中:下一步是修改创建集合的 Set.new 函数。新版本只有一个额外的行,它将 mt 设置为它创建的表的元表:
之后,我们使用 Set.new 创建的每个集合都将具有与其元表相同的表:
最后,我们向元表添加所谓的元方法,即描述如何执行联合的字段 __add:
每当 Lua 尝试添加两个集合时,它都会调用这个函数,并将两个操作数作为参数。
使用元方法,我们可以使用加法运算符来设置联合:
当我尝试运行它时,我得到了结果:{ union, mt, intersection, tostring, new, print}
而不是s3
. 似乎我已经打印了元表的内容。有人可以解释这里发生了什么吗?这本书描述了 5.0 版,我使用的是 Lua 5.1。这可能是造成这种情况的原因吗?