问题标签 [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 回答
620 浏览

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)

0 投票
2 回答
461 浏览

lua - 如何防止我的可调用 Lua 表将自身作为参数传递给 __call?

假设我有以下代码:

而不是打印:

它打印:

表的 id 是 的t

我怎样才能让它表现得好像我print直接打电话一样?

0 投票
2 回答
206 浏览

oop - Lua对象表在对象实例之间泄漏,但不是记录

我正在尝试学习 Lua,所以希望这是一个容易回答的问题。以下代码不起作用。变量 childContext 在类的所有实例之间泄漏。

查看面向对象的 lua 类泄漏,我可以通过将构造函数更改为:

所以我的问题是:

  1. 有没有一种更简洁的方式来声明类变量,就像第一个示例一样,所以我不必将它包含在构造函数中?
  2. 为什么 CxBR_Context.name 可以工作,而表 CxBR_Context.childContexts 却不行?
0 投票
1 回答
74 浏览

inheritance - 从不可变类型继承?

我刚刚回答了一个 Python 问题int,该问题“需要”从(Python 中的不可变类型)继承一个类。我最近一直在做一些 Lua,当我回答这个问题时,我想;“这是如何在 Lua 中完成的?”

那么,我可以从 Lua 中的不可变类型继承一个类吗?如果是,如何?如果不能从整数等类继承,是否有其他方法可以实现类似于我对 Python 问题的回答中的行为?

作为旁注,我仍然很难理解 Lua 的元表。

0 投票
1 回答
444 浏览

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关联的值,并且它起作用了。肯定和 (改编自)具有相同的效果。keyB__index = AB__index = function(t,key) return A[key] end

任何澄清将不胜感激。

0 投票
1 回答
780 浏览

lua - 使用 Metatable 的方法时出错“尝试调用方法(零值)”

运行以下代码时出现错误“尝试调用方法 'Dot'(零值)”:

我不明白我做错了什么,谁能帮忙,我有很好的 Lua 经验,但刚刚开始学习如何使用元表,所以我现在是新手,我正在使用 SciTE 运行它,使用 LuaForWindows。错误在最后一行,但它上面的行完美运行

0 投票
2 回答
9815 浏览

lua - 我需要澄清 Metatable.__index

我之前问过为什么 Lua 没有找到我的元表方法,并被告知通过设置__index我的元表可以解决问题,所以我假设调用时的方法是通过元表中的索引搜索,但我现在遇到了一个问题,我需要在我的元表上使用索引括号[]因此__index被分配从其中的表中返回索引,我如何解决使用方法和使用的功能需求索引括号

我写了一个最小的例子来说明问题:

0 投票
2 回答
544 浏览

lua - 在 Lua 中更改元表会破坏冒号运算符

在学习 Lua 的过程中,我从这里借用了一些代码 来使用字符串索引,就是这样:

之后,我写了一个函数来反转一个字符串作为练习。

这工作正常,直到我将 更改string.len(str)str:len(),然后我收到此错误:

调试 print() 告诉我该__index函数正在被调用str:len(),并且i参数正在变成字符串“len”。我知道 str:len() 可以在没有元表的情况下工作,但是一旦我添加它就会发生这种情况,为什么?

0 投票
2 回答
4046 浏览

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.

0 投票
1 回答
317 浏览

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。这可能是造成这种情况的原因吗?