问题标签 [meta-method]

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 回答
2381 浏览

indexing - Lua - 现有索引的 __newindex 元方法?

我最近在 lua 中了解到 methatables 的存在,我一直在玩弄它们,直到我想到一个想法:是否可以使用它们来尝试避免表中的“重复”?我搜索和搜索,到目前为止找不到我要找的东西,所以我在这里。

  • 所以这就是我想要做的,以及目的:

它将用于 WoW 插件编程。我想制作一个在全局范围内创建变量或函数时会提示警告的工具(避免使用它,因为可能与其他插件发生命名冲突)。我想从那里做的另一件事是将所有传输重定向到 _G 表。因此,当用户在全局范围内创建变量或函数时,该工具会捕获它,将其存储在表中而不是 _G 中,并且每当用户尝试从 _G 访问某些内容时,该工具会首先在所说的桌子; 并仅使用 _G 作为后备。这样,用户就不必担心适当的封装或命名,该工具会为他处理一切。

  • 我已经设法做到了:

我在 _G 上设置了一个 __newindex 元方法来捕获全局范围的变量和函数,并在插件加载结束时删除元方法,以避免它被其他插件使用。对于“_G 传输的间接”,我已经知道如何在尝试使用 _G 之前使用 __index 来尝试给出存储在另一个表中的值。

  • 我遇到的问题:

这很好用,但仅适用于 _G 中尚不存在的变量和函数。每当为 _G 表中已经存在的键分配值时,它都不起作用(原因很明显)。我确实希望能够捕捉到这些情况,并且基本上不可能真正覆盖_G的内容,而是使用一种“重载”(但用户甚至不必知道这一点)。

  • 我尝试了什么:

我试图挂钩 rawset,看看它是否被自动调用,但似乎不是。

我无法在 lua 中找到很多关于 _G 表的文档,主要是因为名称短。我确定某处一定存在某些东西,我可能可以使用这些信息以我想要的方式完成事情,但目前我只是有点迷失并且没有想法。所以,是的,我想知道是否有任何方法可以“捕获”所有“对 rawset 的隐式调用”,以便在让它执行操作之前进行一些检查。我收集到显然没有 __existingindex 或其他东西的元方法,所以你知道有什么方法吗?

0 投票
0 回答
117 浏览

lua - Lua中的“对象”生成函数

我用它在 Lua 中生成“类”。

在 zeroBane Studio 中,此代码启动,我可以执行以下操作

但是当我尝试在 Starbound 中做类似的事情时,它会抱怨 Test1._init(self); 带有消息“尝试索引函数值”。我敢打赌,它与元表有关,但我还不足以自己解决它。有没有办法解决这个问题,这样我就可以使用'。'调用函数?

0 投票
1 回答
251 浏览

lua - 通过_ENV模拟c ++'使用命名空间'

如果我有一个文件foo.lua

bar.lua我大量使用代码时,foo.lua我一直被打字所困扰,宁愿foo.add()只写我可以添加这个:add()bar.lua

但是当您从许多文件中包含许多值的别名时,这开始变得很痛苦。在 c++ 中有一种解决方法:

在 lua 中,我认为您可以像这样模拟此功能:

据我所知,它尊重范围,所以像下面的代码这样的东西很好玩:

实际上下面的代码不起作用。我正在通过 lua repl 运行代码。当我在 lua 文件中编写下面的代码片段时,它没有给出预期的结果。

我有什么理由后悔这样做吗?(除了同样适用的原因using namespace

0 投票
2 回答
67 浏览

lua - 访问 __eq 元方法中的指针?

我有 Lua 对象,它们共享一个具有元方法的元表__eq。在这个元方法中,我想在比较它们之前检查这两个对象是否是同一个对象。类似于你在 java 中的做法a == b || a.compareTo(b)。但问题是通过在==内部进行__eq,它调用__eq并因此调用堆栈溢出。我怎样才能做到这一点?

0 投票
3 回答
940 浏览

c++ - 在 C/C++ 中实现 __index 元函数

我有一个 C++ 回调/仿函数系统的脚本,它可以使用字符串和/或变体调用任何“注册的”C++ 函数。

在lua中我可以做这样的事情......

但是,我觉得我可以使用 __index 元方法来简化 lua...

我希望通过使用 __index 元方法的以下实现来实现简化的 lua

这是我注册 __index 元函数的方法...(主要是从在线示例中复制的)

不幸的是,我似乎无法正确设置回调。Lua 正确调用了我的 LuaGameObject::LuaCallFunction,但堆栈不包含我想要的内容。在 LuaGameObject::LuaCallFunction 中,我可以在堆栈上找到函数名称和 EmpireManager 对象。但是,我在堆栈上找不到参数。设置它的正确方法是什么?还是不可能?

0 投票
0 回答
227 浏览

lua - 在 Lua 5.x 中,用于设置标记方法(如元方法)的 Lua 4.0“gettable”和“settable”事件是什么?

在 lua 4.0 中,标记方法“gettable”允许拦截对表元素的访问。每次尝试访问表格元素时,都会调用“gettable”事件的链接标记方法:

Lua 5.xx 中的等价物是什么?

每次在 Lua 5.x 中访问表时,我的代码如何调用方法?

0 投票
1 回答
125 浏览

lua - 为什么 love2d 不使用我自定义的对元方法?

我在文件 main.lua 中有以下代码:

当我运行时,lua main.lua我得到输出

当我运行时,love ~/path/to/project我得到输出

为什么 love 正确使用其他元方法,而不是对?

我有 LOVE 11.3 (Mysterious Mysteries) 和 Lua 5.3.5

0 投票
1 回答
117 浏览

lua - 如何获取要调用的 __metatable 函数?

我的目标

获取getmetatable返回分配给该__metatable字段的函数的返回值。

代码:

但我得到的是实际功能而不是返回。

那么我如何让它被调用所以我可以得到 nil 呢?所以它似乎没有元表?

0 投票
1 回答
135 浏览

lua - 如何检查 lua 函数调用中的参数类型?

我在旨在模仿类的表元表中重载了这样的乘法运算符。

如何检查函数 mt.__mul(o1, o2) 的函数调用中的哪个参数属于 TestTable 类型?

我需要知道这一点才能正确实现重载乘法。

0 投票
1 回答
67 浏览

oop - Lua - 尝试创建一个好的 Vec2 类

我正在学习如何使用 Lua 和 Love2d,我想使用元方法和元表创建一个 Vec2 类。这是我到目前为止所拥有的:

class.lua:(基类文件)

vec2.lua

在我的 main.lua 中,我有:

我得到这个错误:

错误:main.lua:12:尝试对本地 'v1' 执行算术(一个 nil 值)