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

lua - lua metatable __lt __le __eq 强制布尔转换返回值

在元表中重载__eq__lt__le总是将返回值转换为布尔值。

有没有办法访问实际的返回值?

这将在以下小 lua 脚本中用于为参数创建表达式树

用法:

但它不起作用,print(_.a == _.b)因为返回值被转换为布尔值

ps: print 应该稍后用处理表达式树的函数替换

-- 从 lua 脚本中截取 --

- 折断 -

修改 lua vm 是一个选项,但是如果我可以使用官方版本会很好

0 投票
1 回答
2031 浏览

oop - Lua 元表和元方法 - 如何调用不同的成员函数

我有以下课程

这样做是当您访问table[key]它时执行查找table.__group(这是另一个类的对象)并返回table.__group[key],如果它不是零。

现在我正在尝试对成员函数做同样的事情。即如果我调用table:key() 必须执行查找table.__group并且如果该函数存在,则table.__group:key()应该调用。

我该如何做到这一点?

我试图做到这一点。

但是这里有两件事不对。

  1. 我无法检索原始函数的参数
  2. 事件如果我只是访问table[key].function而不调用它,该函数将被调用

而且我有一种感觉,我试图使事情复杂化,而解决方案则简单得多。

任何帮助表示赞赏。

更新

@Mud原始代码的问题是作为“自我”传递给成员函数的对象是新类的对象。不属于旧班。

考虑这段代码

在上面的代码中,当 progress_object:showSum(3,3)被调用时,是否可以将 group_object(或换句话说 progress_object.__group)作为 self 而不是 progress_object 传递。

希望这是有道理的。

0 投票
1 回答
504 浏览

reference - 在 Lua 中使用 Metatables 时,我有没有办法确定该值是被设置还是被检索?

我在脚本中设置了一个“psuedo-oop”系统,让我可以更好地与应用程序中的 UserData 进行交互。我的系统工作得非常好,只是它不传递引用,而是传递值。因此,如果我这样说:

World.Body.Parent=World.Body2

实际上什么都没有发生,因为它实际上从未将Bodys 父级设置为另一个主体。相反,它有点简化为:

World=World.Body2

(因为它是返回World的父级Body)。现在,如果我做这样的事情,另一方面:

print(World.Body.Parent.Type)

==>World

因为它正确地获得了World对象(作为 的父级Body)。

现在考虑到这一切,是否有某种方法可以确保它通过引用传递而不是实际发送对象?任何想法,将不胜感激!

这是我正在使用的相关源代码:

0 投票
1 回答
3597 浏览

lua - 你好 metatable.__len 世界

一个初学者关于 Lua 和metatables的问题,举个简单的例子,比如 Hello‑World,涉及len事件,不幸的是它没有返回预期的结果(我使用的是从 Ubuntu 官方存储库安装的 Lua 5.1)。

案子

这是示例:

我得到的结果是:

我期待第一个打印语句显示1,但它显示0,令我大吃一惊。

我错过了什么?

根据Lua Reference Manual — Metatables and Metamethods#相当于:

所以print (#a_test);结果print(getmetatable(a_test).__len(a_test));应该是一样的,不是吗?

顺便说一句,为什么参考手册的上述摘录metatable(op)应该是指的getmetatable(op)?至少我已经尝试过print(metatable(a_test).__len(a_test));了,它以错误告终。

回答

正如Nneonneo 所注意到的,这是使用中的 Lua 版本的问题。上述工作似乎需要 Lua 5.2。

0 投票
2 回答
483 浏览

c++ - Lua OOP 函数没有被调用?

我在 Allegro 5 中使用 Lua 和 LuaBridge。我决定将所有图形对象移植到 Lua,但遇到了一些问题:

被调用一次的字符类

从主程序调用函数的 Lua 脚本:

所以基本上,脚本用适当的坐标和图像初始化角色,并绘制它,但要么没有调用逻辑(它在逻辑循环中),要么改变 X 坐标的函数有问题。

此外,任务管理器建议每个周期存在约 30 KB 的内存泄漏,当我在 C++ 中使用图像对象时没有发生这种情况。

下面是通过 LuaBridge 导出到 Lua 的 Bitmap 结构的片段,以备不时之需:

更新:我能够弄清楚的一件事是内存泄漏来自CoreLogic;我在 C++ 中注释掉了对它的调用,内存泄漏消失了,但是当我保持调用不变,但注释掉CoreLogic的内容时,泄漏仍然存在。嗯……

第二次更新:内存泄漏已被缩小到与人工智能有关的东西,我没有发布:

CoreLogic函数中,它会调用Foo.AI:DoBehavior(),这完全没有做任何事情并导致内存泄漏。

0 投票
1 回答
1486 浏览

c - Lua C API代码不调用__newindex函数而是调用其他函数

我编写了一些代码来将注册自定义函数和__newindexand__index函数分离为 2 个单独的函数。我的代码的目标是让 Lua 脚本编写者可以看到函数和变量,这些函数和变量是根据特定的子级别组织的。例如,用户可以使用以下命令:

所以基本上是一个有 2 层的系统,然后是一个函数调用或一个变量。如果我正确理解 Lua,那是表中表中的元表。当用户设置变量时,它应该触发一次__newindex调用(不仅要处理设置值,还要访问将通过电机进行动画处理的物理对象)。我还假设表中的主表orc只看到分配给它的许多功能,无论它是attack还是__newindex。为了在代码开发过程中更容易添加新变量和函数,我创建了 2 个函数:一个用于创建函数,一个用于创建变量。该函数create只是注册函数和变量create只需创建一个新的表格元素并为 和 注册__newindex函数__index。下面是代码:

然后,在我的main()我调用这样的函数:

当我在 Lua 脚本中运行代码和泵时,orc.chief.attack()调用我的OrcAttack()函数但从orc.chief.hp = 100不调用我的orcChief__newindex()函数。我什至已经注释掉了这些registerFunctions电话,以防它们以某种方式干扰,而仅仅是registerIntegerVariable它本身仍然不会触发orcChief__newindex(). 任何想法?

0 投票
1 回答
4568 浏览

garbage-collection - Lua __gc 元方法现在是否适用于表 (Lua 5.2.1) ?

我有点惊讶,因为我以前读过,__gc元方法只对用户数据调用,从不对表调用。(LuaFAQ :为什么 __gc 和 __len 元方法不能在表上工作?

但是,最近,我尝试了它,发现它确实有效!用 Lua 5.2.1 试试这个代码:

但是我在任何地方都找不到此更改日志,所以我有点沮丧并且害怕使用它。

也许,有人可以证明我的建议?或者这是一种无证行为?对我来说,有一个常规的方法来创建表析构函数会很好,如果我的观察是正确的,我会很高兴。

0 投票
1 回答
674 浏览

lua - 捕获对 Lua 中不存在的函数的调用

我想创建一个简单的模拟表,它会告诉我试图从中调用什么。

我的第一次尝试是:

现在用

按我的预期打印:

但试图打电话:

给出:

现在我有两个问题:

  1. 如何避免异常,即。我究竟做错了什么?
  2. 如何也捕获方法参数(在这种情况下为“bar”)?
0 投票
2 回答
665 浏览

syntax - Lua Metatables - 使用冒号语法调用函数

我有以下问题,有人可以帮助我吗?

pru.gr:insert(display.newImage("wakatuBlue.png"))-- 这行有效,但我不想使用gr属性访问插入方法,我想直接调用插入方法并且元表__index函数完成工作

pru:insert(display.newImage("wakatuBlue.png"))--这条线不起作用,我有一个"bad argument #-2 to 'insert' (Proxy expected, got nil)"错误,这是我想要使用的方式

0 投票
1 回答
940 浏览

oop - 元表在 Lua (5.2) 中用于 OOP 的目的是什么?

我正在努力理解元表是如何工作的,以及为什么在 Lua 中需要它们来创建类和继承。我为 Lua 找到的每个 OOP 示例都与上一个有所不同,但它们总是使用元表,特别是针对__index属性。以下是我如何实现一些简单的继承:

输出:

据我所知,这很好用。使用元表将如何改进我的设计?