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

lua - Lua Metatables 尝试索引?

所以这是我写的一些代码:

我认为通过使用元__index方法,不会有错误,但它仍然会抛出attempt to call field ?错误。我猜它仍然会抛出错误,所以有没有办法可以使用它来捕捉它pcall()

mt看起来像这样:

并且无效:

仅当用户输入未在表中列出的操作数时才会引发此错误 ( input > #fileFunc)

0 投票
2 回答
1362 浏览

lua - Lua __metatable 绕过?

我想知道是否有任何方法可以逃避 __metatable 元方法。我知道没有,但我正在尝试做这样的事情,但显然 __metatable 阻止了这种情况的发生:

我在这里要做的只是逃避 __metatable 字段,并简单地允许自己在 _G 上设置一个元表,它已经有一个。我知道这样做是不可能的,但是我想问一下还有没有机会绕过?

0 投票
1 回答
501 浏览

lua - next() 是否寻找 __pairs 元方法?

一般来说,语法:

相当于:

但是如果t__pairs元方法呢?标准next()功能会对此进行检查吗?如果不是,那么在迭代表时总是使用而不是直接 调用不是更好吗?pairsnext()

0 投票
3 回答
66 浏览

lua - 我们如何改变 print 显示表格的方式

假设我有一段代码如下

我必须做什么才能让 Lua 打印出aTable current aValue = 1类似于table: 0x01ab1d2.

到目前为止,我已经尝试设置元__tostring方法,但似乎并没有被print. 是否有一些我遗漏的元方法或者答案与元方法无关?

0 投票
0 回答
1016 浏览

lua - Lua setfenv/metatable 沙箱不适用于 ROBLOX 方法

在 ROBLOX Lua 中,我正在编写一个涉及用户创建和运行 Lua 脚本的游戏。显然,我需要阻止使用某些服务和功能,例如 Player 类上的 Kick 功能,或者与 DataStore 或 TeleportService 相关的任何东西。

到目前为止,我已经成功地通过使用 setfenv 将函数的环境设置为附加到“沙盒”表的元表来创建沙盒环境。在 __index 上,如果在沙盒表中没有找到任何内容,则它在真实环境中看起来就像正常情况一样。这使我可以将假函数放入沙盒表中,而不是使用它们的真实对应函数。

但是,假设我对 ClearAllChildren 函数进行了沙盒化。玩家可以通过这样做轻松逃离沙盒:

这是因为获取实例的 Parent 为他们提供了真实版本,而不是沙盒版本。这个缺陷也可以通过许多其他方式消除。

所以我做了一个对象包装器。在实例上调用 wrap(obj) 会返回一个使用 newproxy(true) 创建的假版本。其元表的 __index 确保对象的任何子对象(或实例属性,例如 Parent)将返回一个包装的版本。

我的问题可能与我设置包装器的方式有关。尝试在沙箱内的对象上调用任何方法,如下所示:

导致以下错误:

这是目前我的沙箱的完整代码:

我怎样才能解决这个问题?

0 投票
1 回答
213 浏览

lua - 为什么短调用形式不适用于 Lua 5.3 中的表格?

路亚 5.3

这不起作用,为什么?为什么短调用表格不适用于表格?

这行得通...

0 投票
1 回答
1099 浏览

c++ - Lua“尝试索引一个零值”

我正在尝试使用 Lua 注册一个向量类型,但是当我从 Lua 调用添加元函数时,我遇到了一个奇怪的“尝试索引新值”错误。

这是涉及的代码部分。我没有包含任何其他元函数(它们有同样的问题,唯一的区别是最后一行中使用的数学运算符)。错误似乎来自static int LuaVector_lua___add(lua_State *L)函数。

它与代码崩溃:

我试图找出导致它的原因,但我无法确定有故障的实际线路(不过,我相信它lua_gettable本身会触发错误)。所以它可能是任何东西,但我似乎无法弄清楚。

0 投票
1 回答
245 浏览

c++ - 用于函数调用捕获的 Lua 元表

我正在尝试使用 Lua Metatables 为一些内部 C++ 函数创建一个更漂亮的接口。

这是我到目前为止工作的代码。(my.get并且my.set在 C++ 中实现)

到目前为止还好。我想做的下一点是对表的函数调用,如下所示:

我知道这会调用my.get("LABEL","Flash")——我可以让它返回一个 C++ 函数(使用lua_pushcfunction),但是当调用 C++ 函数时,它缺少LABELFlash参数。

这是my.get.

0 投票
1 回答
527 浏览

lua - 将 _concat 添加到数字以创建数字范围 - 我疯了吗?

就像一个随机实验一样,我正在考虑向元表添加一个__concat()元方法number(通常是一个新的元表,因为数字似乎默认没有元表?)。

这个想法是我可以做类似的事情3..5然后回来3, 4, 5

然后我可以有一个函数foo(tbl, ...),它对表上的多个索引执行某些操作,并将其称为foo(tbl, 3..5).

我是在狂吠还是这样做似乎可行?

代码草稿(尚未测试):

附加问题:我有什么方法可以...按值填充值(以消除上面示例中对表格和解包的需要)?

0 投票
1 回答
482 浏览

lua - 元表,尝试调用方法“重命名”(零值)

这是我第一次使用元表,我做了一个简单的脚本在 Lua 演示中进行测试,但它总是让我“尝试调用方法 'rename'(一个 nil 值)”,为什么?