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

methods - 制作可以直接改变参数的lua方法

如何创建类似string.gsub(...)lua 的方法?

我希望我的函数可以更改我将它们传递给函数的参数。

我知道字符串和数字类型变量在函数中按名称( CALL BY VALUE )传递,

但是我不知道当我们尝试像变量更改一样使用它并受方法影响时s:gsub(...),gsub 会如何更改(直接应用于字符串类型变量)!sgsub(...)

我想创建一个方法Inc(...),当我像ex:Inc()ex (number var) 一样使用它时增加 1 !!!

帮我实现这个......我希望 ex 变量(例如:ex = 1)是数字的(不是表格)

谢谢你 。

0 投票
1 回答
435 浏览

lua - Lua - 为协程指定库

在我的 Lua 脚本中,我有多个使用相同“结构”的库。例如,我有一个包含require('b')和.lua 的内容require('c')。b.lua 和 c.lua 都有 info 函数。b.lua 让它打印“b”,c.lua 让它打印“c”。在 a.lua 中,我想使用来自 B.lua 或 C.lua 的 info() 启动协程。

这是我的 b.lua:

C.lua 有一个类似的结构,但大多数 B 都被 C 替换了。当试图启动协程时local co = coroutine.create(b.info())(这也很奇怪,因为它通常开始挂起)我收到一个错误,比如“尝试跨越元方法/C 调用边界”。

0 投票
1 回答
406 浏览

lua - 修改lua中的#操作符

我在love2d引擎上做了一个无关紧要的lua控制台。我正在尝试升级元表以能够影响更多的东西(配对功能,在另一个表上更改元表而不是目标表等),我正在制作的插件之一是__changeindex当您修改现有的时的一个事件指数。

为了做到这一点,我必须给用户一个不包含任何值的虚拟表,当他们尝试添加一些东西时,检查它是否已经在真实表中定义,如果它是那么 call __changeindex,如果不是那么 call __newindex。这可以完美运行,但是这会导致许多其他 Lua 表函数停止工作(对于循环/getmetatable/setmetatable)。我已经为大多数这些问题制定了解决方法,它们工作正常,但我无法让#t 运算符工作,我想说

然后#t2 应该真的返回#t1。我有什么办法可以做到这一点吗?

我现有的代码可以在这里找到

编辑:这是我的第一篇文章,所以如果我没有完全遵守发布规则,我深表歉意,我试过了 :) 如果有人有办法让假表和真表垃圾收集,我将不胜感激

0 投票
2 回答
402 浏览

lua - 如何保存布尔条件并稍后评估

我需要创建一个结构。该结构必须包含一个“布尔条件”数组。像这样的东西:

实际上这些表包含真假,而不是条件,因为当我们调用函数 ReturnStructure 并创建本地表结构时,字段中的所有条件都会被执行。我想创建一个结构,其字段将不包含布尔值,而是我可以执行的东西(当我想做的时候)并获得一个布尔值。我可以通过使用匿名函数来实现这一点:

所以,有一个代码可以按我的意愿工作,但它看起来很丑陋。我想听听一些关于如何创建更简单、更漂亮的表格的想法,而无需function () return ...在每个领域都打印。我认为我应该使用简单的 OOP 实现将我的结构创建为对象,但我不知道该怎么做。我也很乐意得到一些方法、实现、文章等的参考,这可以帮助我找到一些想法。

0 投票
0 回答
407 浏览

c++ - Lua __index 元方法未从 C++ 绑定

我正在为 Lua 中的电子项目开发一个软件库,它是退出面向对象的。我的对象具有 getter 和 setter 的属性,它们分别使用 __index 和 __newindex 元方法实现。问题是 __index 元方法不起作用,而 __newindex 一个工作正常。我的绑定代码:

现在,当我执行这个 Lua 脚本时:

我得到以下输出:

这意味着 __index 元方法是一个表,因此它不受 C++ 的约束。我在绑定代码中做错了什么?

0 投票
2 回答
1071 浏览

lua - Lua override # for strings

I'm trying to imlement my own length method for strings in Lua. I have successfully overriden len() method for string, but I have no idea how to do this for # operator.

If I call:

It outputs:

But

Outputs only '3' and that means it called original length function instead of mine. Is there a way to make # call my length function?

0 投票
1 回答
63 浏览

inheritance - 如果 __index 被子类的对象调用,则将继承的表成员存储到子类中

我的目标是有一种标准的方式来创建具有全面多重继承的类,并且能够不仅继承到其他类,而且还能够通过new()-constructor 继承到它们自己的实例。如果我从类或其对象中调用缺失值并且该值是一个函数,我希望将其存储到类中以供以后使用,而不是在对象/实例中(大量实现相同函数时的性能问题一个类的数量)。

目前,我正在使用与官方教程系列( http://www.lua.org/pil/16.3.htmlcreateClass(...) )中提到的非常相似的 -function来创建从几乎任意数量的父类继承的类:

它将索引元方法传递给新创建的类,该类在所有父类中搜索指定的缺失键并将其存储以供以后在调用类中使用。即使在搜索巨大的嵌套继承层次结构时,这也可以作为意图。现在,让我们介绍一个带有基本构造函数的简单类:

如果我们用下面的代码调用这个继承和类实现,那么我们会看到当创建类的新实例时不会调用类的-metamethod __index(比较输出的表地址),即使__index对象从其(父)类中请求缺少的值/函数,此时该类没有这样的值/函数。显然,这种描述并没有调用__index使我感到困惑的类本身的 -metamethod。我假设它总是在请求类/表的缺失值时被调用,无论来自脚本的哪个部分。

  1. 为什么在给定的示例中没有调用__index-metamethod ?MyClass
  2. 我怎样才能完成它(通过尽可能少地更改代码)?

欢迎您提出建议!

0 投票
2 回答
4806 浏览

lua - lua __pairs 的实际实现是什么?

有人知道 lua 5.2 的实际实现吗?元方法__pairs?换句话说,我如何__pairs在元表中实现元方法,以便它与 完全相同pairs()

我需要覆盖__pairs并希望跳过我在表中添加的一些虚拟变量。

0 投票
2 回答
785 浏览

lua - Lua:按名称解释未定义的变量

我有一个函数foo可以在某些情况下获取 nil 值,即foo(VarA)whileVarA未定义。这个 undefinedVarA应该被解释为"VarA"但我不能调用foo("VarA"),因为VarA它应该作为一个选项参数(不同于普通的字符串参数)。

这将获得所需的结果,但现在所有其他未定义的变量都将返回其名称。喜欢abc -> "abc"。您是否看到在这种特定情况下仅激活元表的任何方法?我可以在我的方法中切换元表,foo但是当我在foo块中时,传递的参数已经为零并且为时已晚。

附录:我认为这个问题不够具体。Schollii 将参数作为表格传递的答案很好,但没有按预期工作:

这应该有键信息(选项 1 和选项 2)加上值的信息(即使删除和推送在全局或本地命名空间中不存在)。Schollii 的方法会给我关键信息而不是价值信息(如“删除”和“推送”)。我不能预先定义删除和推送,因为这些新的“关键字”应该稍后由函数本身定义。将这些新关键字作为字符串传递是没有选择的。

0 投票
2 回答
457 浏览

debugging - 访问深度嵌套的表没有错误?

对于深度嵌套表中的字段,例如 text.title.1.font。即使你使用

如果表的任何级别实际上不存在,它将导致类似“尝试索引全局'文本'(零值)”的错误。当然,可能会尝试检查表的每一级是否存在,但这似乎相当麻烦。我想知道是否有一种安全且更漂亮的方法来处理这个问题,这样当引用这样的对象时,nil 将是值而不是触发错误?