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

lua - Lua类不工作

我在 Lua 中有一个简单的类实现。

我运行它时不断收到此错误:

lua: test.lua:12: '=' 预期在 'name' 附近

我不确定发生了什么或为什么会发生这种情况,任何帮助将不胜感激。

0 投票
3 回答
730 浏览

oop - Lua/Corona 中的类结构

所以我正在 Lua 中开发一款游戏,我正在尝试使用元表和分类,但我认为我正在导入我的 PHP 知识并稍微横向做事。

我基本上希望能够产生几种不同类型的怪物,并为它们保留一些基类功能,但我不确定在上面的示例中我如何将基类与Groblin我制作的类联系起来,因为我觉得我在Groblin:new.

0 投票
1 回答
151 浏览

string - 将 Barewords 添加到 Lua

为了在 lua 中实现特定领域的语言,我想在语言中添加裸词。所以 print("foo")可以写成print(foo)

我这样做的方法是更改​​环境表的元表_G

这很有效,因为检索变量的值foo是通过_G.foo相当于_G["foo"]

这是一个好方法吗?有没有隐藏的缺点?有没有更好的办法?我可以这样做以使裸词仅在某个文件中起作用吗?(也许通过从另一个 luascript 执行该文件,使用loadstring

0 投票
2 回答
651 浏览

c# - LuaInterface C# 元表

我有一些后台 lua 代码,我在每次启动时加载它们,它们工作正常,但是有什么方法可以将它们转换为 C#?

这是我的元表代码:

它工作正常,这是我的代码目前的工作方式:

目前,我在注册 lua 函数代码中使用 void 搜索 Player.cs 对象,我的 C# 代码上没有任何特殊的 void 或函数,其中包含 Player 对象,但我想将它们全部更改为 Player 对象,还有什么方法我可以使用 Player.cs voids/strings 或来自 lua 的任何东西而不注册它们?Player.cs 对象是非静态的。

0 投票
1 回答
3163 浏览

lua - 在 Lua 中使用“对象”函数?

我希望能够在 Lua 中拥有具有引用自身的某些函数的“对象”(我不知道该怎么称呼它)。我已经看到了我正在尝试做的代码,但我从来没有理解它的实际含义。我曾尝试查看 Lua 网站,但没有运气。

基本代码:

有人可以解释这里发生了什么以及我如何使用它吗?谢谢阅读!

0 投票
1 回答
1444 浏览

c++ - Lua C API - 从堆栈上的表中获取元表

假设我们有一个传递给函数的表,它现在位于堆栈顶部,如下所示:

是否可以从堆栈中的该表中获取元表?我可以简单地使用已知名称标识符来获取它,如下所示:

但我想重用该函数并从堆栈中的表中获取元表。

可能有一种简单的方法可以做到这一点,但我似乎找不到为此的功能。

0 投票
2 回答
1491 浏览

c++ - 在lua中有没有办法将upvalue绑定到userdata值而不是函数?

在下面的示例userdata中,创建了一个类型的值,并使用调用MyType的元函数创建了一个表。该代码创建了一个基于闭包的 lua OOP。我对提供的示例的抱怨是,似乎只有一种方法可以通过 upvalues 与方法调用关联。就其本身而言,这不是问题,除非我想跨实例共享相同的元表。__tostringLI_MyType__tostringuserdata

在一个理想的世界中——以及我希望通过这个问题挖掘出的东西——有没有办法将一个上值与一个值(例如userdata)相关联,而不用通过一个上值将它与函数调用相关联?我希望有一个技巧可以让我继续使用基于闭包的 lua OOP跨实例共享相同的元表。我并不乐观,但我想我会问一下是否有人有建议或不明显的技巧。

我希望有一种方法可以执行类似的操作(这是伪代码!):

我知道这类似于 OOP 的“正常”元表样式的情况,但我想保持基于闭包并避免引入冒号语法。

问这个问题的另一种方法是,有没有办法userdata在使用基于闭包的 OOP 时跨实例共享元表?从脚本方面使用 lua 的语法,我认为这是不可能的,但我希望在 C 方面可以做一些事情。


更新(2013 年 10 月 10 日):基于@lhf 的使用答案lua_setuservalue()lua_getuservalue()我确定的允许我重用元表的协议是这样的:

  1. 使用 . 注册单个元表对象luaL_newmetatable()。现在可以跨userdata实例共享此元表,因为注册元表时不使用上值。
  2. 创建一个userdata值 ( lua_newuserdata())。
  3. 将正确的元表分配给userdata值 ( lua_setmetatable())。
  4. 创建并使用一个上值填充实例方法调用/属性表,即userdata.
  5. 使用lua_setuservalue()onuserdata存储对每个实例属性/方法表的引用。
  6. 更改各种元方法(例如__index)以使用userdata的用户值表。

作为结果:

  • 元方法中从不使用 upvalues
  • upvalues 仅用于值的实例方法中
  • 给定类的每个实例只有一个额外的表

仍然不可能逃避为每个用户数据创建方法/属性表,但这种开销是名义上的。如果在不使用的情况下以某种方式obj.myMethod()传递会很好,但这正是这样做的,因为这是不可能的另一种方式(除非你确实使用了上值)。objfunction myMethod()::

0 投票
1 回答
731 浏览

c - Lua C API - 将属性映射到函数

是否可以将函数作为 Lua 中的属性推送?

现在,我可以通过将它们作为字段推送来拥有 Get/Set 函数,如下所示:

并像这样在 Lua 中调用它们:

是否可以推送映射到没有元表的 C 函数的属性?我可以将__index和元表映射__newindex到自定义函数,但我想知道是否有更简单的方法。最终,我想要以下没有元表的语法:

这可能没有__indexand__newindex吗?

0 投票
1 回答
146 浏览

lua - lua 解释器,必须两次导入文件才能获得全部功能

所以我有一个类似的lua文件:

我在解释器中输入以下内容:

该方法在我第二次导入文件时有效,但不是第一次。为什么是这样?我试过改变顺序(把构造函数放在最后),结果是一样的。

0 投票
2 回答
86 浏览

lua - Lua - 仅调用元表中的一个运算符

我是 Lua 的新手,所以可能错过了一些教程,但问题是:

我有原始表和元表以及我正在应用的几个运算符:

不幸的是,当我进行以下操作时:

我收到一个错误:

没有找到关于这个问题的任何描述。我还注意到,如果 metatable 是一个单独的变量并传递给setmetatable方法,那么它可以工作..