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

lua - 如何理解 Lua 中的元表?

我用过 Python,但现在我因为 Torch 正在学习 Lua。“metatable”这个词对我来说真的很难理解。例如,元表是一种特殊的表吗?它如何改变表的行为?

0 投票
1 回答
173 浏览

indexing - Lua,2-dim。数组元表在“nil”时获取值

我正在尝试使用 将新表添加到“G” __index,我需要从表中获取价值,即使它是,并将其放入。当值在表中时,我收到错误“堆栈溢出”。矩阵是对称的,我将值从垂直翻转到水平。我不知道如何解决这个问题。nilAGnilA

0 投票
1 回答
120 浏览

lua - 在 metatable 本身内部调用 metatable 方法

有没有办法在元表本身内部调用元表方法?例如

引发此错误:

尝试调用方法“声音”(一个零值)

0 投票
1 回答
1823 浏览

c - Lua:查询用户数据对象的元表名称

我想查询某个对象的元表的名称。

考虑到我有一些元表注册如下:

这里的文档说明了luaL_newmetatable双重关联,即它使用名称作为表的键,表作为名称的键。因此,有了这些知识,我认为我可以实现以下目标:

并像这样注册:

但是,不幸的是,它没有用,它返回了nil。那么,我有什么不好?

在这里,一些完整的源代码(在 C++ 中):

输出是nil。我的 Lua 版本是 5.3 。

0 投票
1 回答
366 浏览

inheritance - Lua metatable __index 定位的区别

我一直看到两种定义元表的方法__index

或者:

我不太明白两者之间的行为差​​异是什么。有人可以启发我吗?

0 投票
1 回答
1118 浏览

c++ - 使用 C API 覆盖 Lua 中的赋值运算符

我的 C++ 程序中有对象作为用户数据传递给 Lua,我重写了此用户数据的元表,以便对对象索引的分配(通过 __newindex 和 __index)导致对 C 的调用,它转换分配影响 C++ 对象或将 C++ 元素转换为 Lua 值(另一个用户数据或基本类型,如 bool、number、string)。用户数据作为参数传递给从我的 C++ 程序调用的类似事件的 Lua 函数。

但是,这不允许我分配实际变量本身,只能分配变量的索引。没有直接覆盖赋值运算符的元事件,所以我正在寻找一种解决方法。

换句话说,我可以这样做:lua_userdata_object_passed_as_arg_to_event["is_it_true"]=true 它会将 Lua 布尔值分配给我的内部 C++ 对象,但如果我这样做: lua_userdata_object_passed_as_arg_to_event = new_object() 它将更改 Lua 变量引用的内容,但它不会对核心对象做任何事情,据我所知它。

我考虑过的一种解决方法是,lua_userdata_object_passed_as_arg_to_event["__self"] = new_object() 如果开发人员想要更改对象本身,需要进行一些破解,但这是不可取的。

因此,我找到了一些独特的解决方案来通过使用全局变量和覆盖全局元表赋值运算符来覆盖赋值运算符,但我正在寻找是否有人可以帮助我解释这个解决方案。见http://lua-users.org/lists/lua-l/2012-01/msg00413.htmlhttps://www.lua.org/pil/14.2.html。特别是,我的变量是函数参数,而不是全局变量,那么如何通过 C API 转换为全局变量,以便自定义 C 函数捕获任何分配,如果分配发生在全局用户数据上,该函数将采取行动?

顺便说一句,我的 userdata 是一个指向对象的指针,以避免复制大对象,如果这很重要的话。

0 投票
1 回答
683 浏览

c - Lua userdata:无法同时访问数组和方法

我遇到了这个人的问题: Lua userdata array access and methods

其中,当我设置我的用户数据元表的 __index 时,它总是调用 getter,而不是我没有为元事件声明的其他方法。上述链接的解决方案是在 Lua 中,我尝试了一个看起来不优雅的 C 实现,但无论如何,它会产生一个新问题,因为我的新方法不能再接受参数,并且我收到此错误:

attempt to call method 'asTable' (a table value)

在这个 Lua 声明中:

print_r(c:asTable() )

这就是我设置所有内容的方式:

然后在默认调用的getter(通过__index)中,我首先检查我打算调用的其他事件并将控制权转移给它们,如下所示。请注意,我从堆栈中删除了包含函数名称的参数。

无论传递了多少参数,它都不会将我的方法视为函数,并且即使有任何括号或冒号也会引发错误。(它可以通过 来访问c.asTable,这对于不带参数的方法工作得很好,但我计划添加一些这样做的方法,无论如何,语法与方法不一致。

在任何情况下,最好不要通过我的 C getter 调用这些函数,而是使用元表来解决这个问题。如果可能,请提供一个使用 C API 的示例——Lua 中已经有 StackOverflow 解决方案,但我无法将它们翻译成 C。

0 投票
1 回答
156 浏览

c++ - Lua 元事件参数顺序

我正在使用 Lua API 来覆盖我自己的 C++ 对象的元事件,这些对象包装为用户数据。但是,一些元事件可以采用多个参数,这些参数可能是用户数据或常规值,我可以将其转换为用户数据。例如,__add、__eq、__concat 等。

首先,对于这些元事件,如果我将两个用户数据相加,它们的 __add 会被调用,它是否只被调用一次?如果我有两种不同类型的用户数据和不同的 __add 钩子,这是相关的(尽管它们有不同的返回结果是不好的做法)。

其次,对于这样的示例:2 + userdata代替userdata + 2,是否可以保证 userdata 总是首先出现在堆栈上?这将使我的实现更加简单明了,除了 __index 之外,我还没有找到太多关于元事件详细行为的文档。

最后,如果添加多个对象,Lua 的行为是什么?从不使用 C API 的元表测试来看,似乎是 PEMDAS 排序。即 userdata1 + 3 + userdata2 + userdata3 + nonuserdata,但我没有找到证实这一点的参考。__add 是否只使用堆栈上的所有参数调用一次,调用第一个用户数据的 __add,还是从一个方向传播创建临时右值?

这是我如何从 __arg 的堆栈中获取 args 的示例,如果参数的顺序得到保证,这很简单。

0 投票
1 回答
2139 浏览

lua - 从 Lua 中的表中删除元表

我想从表中“解开”一个元表,并想知道是否:

这样做的正确方法是什么?我找不到有关如何正确执行此操作的任何信息。我需要使用赋值运算符吗?

此外,如果元表从来没有引用并且是匿名的,这是否足以破坏附加到表的元表?:

垃圾收集器足以删除两个表吗?

0 投票
1 回答
311 浏览

lua - 当我想从 c 调用表时,Lua PCall 可以调用 __call 元函数吗

我正在尝试使用 c API 和 Lua5.1 调用表。

我正在按照以下步骤进行操作:

  1. 创建一个具有__call元功能的表“mt”
  2. 创建一个表“newT”并将“mt”设置为“newT”元表
  3. pcall“新T”

我的问题是在第 3 步,我收到错误:“尝试调用表值”

谁能告诉我如何在c中调用表格?