问题标签 [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.
lua - Lua Metatables 尝试索引?
所以这是我写的一些代码:
我认为通过使用元__index
方法,不会有错误,但它仍然会抛出attempt to call field ?
错误。我猜它仍然会抛出错误,所以有没有办法可以使用它来捕捉它pcall()
mt
看起来像这样:
并且无效:
仅当用户输入未在表中列出的操作数时才会引发此错误 ( input > #fileFunc
)
lua - Lua __metatable 绕过?
我想知道是否有任何方法可以逃避 __metatable 元方法。我知道没有,但我正在尝试做这样的事情,但显然 __metatable 阻止了这种情况的发生:
我在这里要做的只是逃避 __metatable 字段,并简单地允许自己在 _G 上设置一个元表,它已经有一个。我知道这样做是不可能的,但是我想问一下还有没有机会绕过?
lua - next() 是否寻找 __pairs 元方法?
一般来说,语法:
相当于:
但是如果t
有__pairs
元方法呢?标准next()
功能会对此进行检查吗?如果不是,那么在迭代表时总是使用而不是直接 调用不是更好吗?pairs
next()
lua - 我们如何改变 print 显示表格的方式
假设我有一段代码如下
我必须做什么才能让 Lua 打印出aTable current aValue = 1
类似于table: 0x01ab1d2
.
到目前为止,我已经尝试设置元__tostring
方法,但似乎并没有被print
. 是否有一些我遗漏的元方法或者答案与元方法无关?
lua - Lua setfenv/metatable 沙箱不适用于 ROBLOX 方法
在 ROBLOX Lua 中,我正在编写一个涉及用户创建和运行 Lua 脚本的游戏。显然,我需要阻止使用某些服务和功能,例如 Player 类上的 Kick 功能,或者与 DataStore 或 TeleportService 相关的任何东西。
到目前为止,我已经成功地通过使用 setfenv 将函数的环境设置为附加到“沙盒”表的元表来创建沙盒环境。在 __index 上,如果在沙盒表中没有找到任何内容,则它在真实环境中看起来就像正常情况一样。这使我可以将假函数放入沙盒表中,而不是使用它们的真实对应函数。
但是,假设我对 ClearAllChildren 函数进行了沙盒化。玩家可以通过这样做轻松逃离沙盒:
这是因为获取实例的 Parent 为他们提供了真实版本,而不是沙盒版本。这个缺陷也可以通过许多其他方式消除。
所以我做了一个对象包装器。在实例上调用 wrap(obj) 会返回一个使用 newproxy(true) 创建的假版本。其元表的 __index 确保对象的任何子对象(或实例属性,例如 Parent)将返回一个包装的版本。
我的问题可能与我设置包装器的方式有关。尝试在沙箱内的对象上调用任何方法,如下所示:
导致以下错误:
这是目前我的沙箱的完整代码:
我怎样才能解决这个问题?
lua - 为什么短调用形式不适用于 Lua 5.3 中的表格?
路亚 5.3
这不起作用,为什么?为什么短调用表格不适用于表格?
这行得通...
c++ - Lua“尝试索引一个零值”
我正在尝试使用 Lua 注册一个向量类型,但是当我从 Lua 调用添加元函数时,我遇到了一个奇怪的“尝试索引新值”错误。
这是涉及的代码部分。我没有包含任何其他元函数(它们有同样的问题,唯一的区别是最后一行中使用的数学运算符)。错误似乎来自static int LuaVector_lua___add(lua_State *L)
函数。
它与代码崩溃:
我试图找出导致它的原因,但我无法确定有故障的实际线路(不过,我相信它lua_gettable
本身会触发错误)。所以它可能是任何东西,但我似乎无法弄清楚。
c++ - 用于函数调用捕获的 Lua 元表
我正在尝试使用 Lua Metatables 为一些内部 C++ 函数创建一个更漂亮的接口。
这是我到目前为止工作的代码。(my.get
并且my.set
在 C++ 中实现)
到目前为止还好。我想做的下一点是对表的函数调用,如下所示:
我知道这会调用my.get("LABEL","Flash")
——我可以让它返回一个 C++ 函数(使用lua_pushcfunction
),但是当调用 C++ 函数时,它缺少LABEL和Flash参数。
这是my.get
.
lua - 将 _concat 添加到数字以创建数字范围 - 我疯了吗?
就像一个随机实验一样,我正在考虑向元表添加一个__concat()
元方法number
(通常是一个新的元表,因为数字似乎默认没有元表?)。
这个想法是我可以做类似的事情3..5
然后回来3, 4, 5
。
然后我可以有一个函数foo(tbl, ...)
,它对表上的多个索引执行某些操作,并将其称为foo(tbl, 3..5)
.
我是在狂吠还是这样做似乎可行?
代码草稿(尚未测试):
附加问题:我有什么方法可以...
按值填充值(以消除上面示例中对表格和解包的需要)?
lua - 元表,尝试调用方法“重命名”(零值)
这是我第一次使用元表,我做了一个简单的脚本在 Lua 演示中进行测试,但它总是让我“尝试调用方法 'rename'(一个 nil 值)”,为什么?