Lua:冒号符号、“自我”和函数定义与调用

2024-04-19

我对定义/调用 Lua 函数时使用的冒号表示法感到非常困惑。

我以为我已经明白了,直到我看到这段代码:

function string.PatternSafe( str )
    return ( str:gsub( ".", pattern_escape_replacements ) );
end

function string.Trim( s, char )
    if char then char = char:PatternSafe() else char = "%s" end
    return string.match( s, "^" .. char .. "*(.-)" .. char .. "*$" ) or s
end

这里让我感到困惑的是 string.PatternSafe() 没有在任何地方引用“self”,但代码似乎可以工作。

我还看到一些脚本在定义函数时使用冒号表示法,例如:

function foo:bar( param1 ) ... end

经过几个小时的谷歌搜索后,我仍然无法弄清楚这两种情况下到底发生了什么。我目前的假设如下:

  1. 如果使用冒号符号定义函数,它将获得一个不可见的“self”参数作为第一个参数插入
  2. 如果使用冒号表示法调用函数,则“:”前面的对象将插入到参数中(因此成为函数的第一个参数)
  3. 如果使用点表示法调用函数,那么即使它是使用冒号表示法定义的,它也不会获得作为第一个参数/参数插入的对象

如果我的假设是正确的,就会引发一个额外的问题:确保正确调用该函数的最佳方法是什么?


你的假设都是正确的。

假设1来自手册 http://www.lua.org/manual/5.1/manual.html#2.5.9:

冒号语法用于定义方法,即函数 有一个隐式的额外参数 self.因此,声明

 function t.a.b.c:f (params) body end

是语法糖

 t.a.b.c.f = function (self, params) body end

假设2来自手册 http://www.lua.org/manual/5.1/manual.html#2.5.8:

调用 v:name(args) 是 v.name(v,args) 的语法糖,只不过 v 仅计算一次。

假设 3 没有直接的手册部分,因为这只是正常的函数调用语法。

但事情是这样的。self只是语法糖中给出的自动魔术名称,用作冒号赋值的一部分。这不是一个必要的姓名。无论名称是什么,第一个参数都是第一个参数。

所以在你的例子中:

function string.PatternSafe( str )
    return ( str:gsub( ".", pattern_escape_replacements ) );
end

第一个参数是str所以当函数被称为char:PatternSafe()脱糖(通过假设 2)char.PatternSafe(char)这只是过去char作为第一个参数的函数(正如我已经说过的,是str).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lua:冒号符号、“自我”和函数定义与调用 的相关文章

  • C 的哪些部分最可移植?

    我最近读到了 Lua 联合创始人 Luiz H de Figueredo 和 Roberto Ierusalimschy 的采访 他们讨论了 Lua 的设计和实现 至少可以说这是非常有趣的 然而 讨论的一部分让我想起了一些事情 Robert
  • 如何简洁地赋值并立即调用函数变量?

    以下是在闭包中定义匿名函数 调用该函数并忽略它的方法 function do stuff 这用于维持有限的范围而不向脚本添加大量内容 IIFE 立即调用函数表达式 如果您希望立即执行某个函数 同时仍保留该函数以供将来使用 该怎么办 如下所示
  • 将函数绑定到 Kivy 按钮

    我正在尝试将以下函数绑定到Button在基维 def auth self print self username if self username Hendricko print self username Hendricko popup
  • 隐藏包中未记录的函数 - 使用 .function_name?

    我需要在包中提供一些功能 但我不想导出它们或为它们编写文档 我只是将它们隐藏在另一个函数中 但它们需要可供多个函数使用 因此这样做会成为范围界定和维护问题 这样做的正确方法是什么 我的意思是他们是否需要特殊的名字 他们是否会去其他地方 R子
  • 检查lua中是否存在目录?

    如何检查 lua 中是否存在目录 如果可能的话最好不使用 LuaFileSystem 模块 尝试做类似以下 python 行的事情 os path isdir path 这是一种在 Unix 和 Windows 上都适用的方式 无需任何外部
  • 在一个函数中返回两个变量[重复]

    这个问题在这里已经有答案了 考虑以下代码 demo http jsfiddle net m59Fg function test var h Hello var w World return h w var test test alert t
  • TypeError: 调用 Function.prototype.method() 时 this.prototype 未定义

    我正在读 Javascript 优秀部分 一书 现在我正在阅读有关增强类型的章节 Function prototype method function name func this prototype name func return th
  • 创建线程-传递参数

    我正在尝试创建多个线程 每个线程计算素数 我正在尝试使用线程创建将第二个参数传递给函数 它不断抛出错误 void compute prime void arg void arg2 这是我的 main 和创建线程 max prime 之后的
  • r 函数使用子集调用 lm

    我正在编写一些代码 我注意到一些奇怪的事情 当我在某些面板数据的子集上运行 LM 时 它工作正常 如下所示 library plm data Cigar lm log price log pop log ndi data Cigar sub
  • PHP函数十六进制或RGB颜色到颜色名称

    是否有一个 php 函数可以通过给出 rgb 或十六进制颜色作为参数来返回最接近的颜色名称 我已经搜索了很多 但找不到可以完成这项工作的函数 请帮忙 请参阅下面我的代码 我用它来复制徽标颜色以在运行时自动更改网站主题 希望它有效 只需将图像
  • 如何覆盖 app/code/core/Mage/Core/functions.php 中的 Magento 函数

    我需要重写此文件中的一个函数 应用程序 代码 核心 Mage Core functions php 问题是 它是如此核心 以至于没有与之关联的类 可能是因为 Core 甚至不是一个模块 有谁知道如何在没有类的情况下覆盖文件中的函数 任何帮助
  • 这个具有多个值(变量)的 return 语句如何工作? [复制]

    这个问题在这里已经有答案了 我试图了解 C 函数中按值传递和返回是如何发生的 我发现一段代码如下 include
  • 如何在aerospike中获取ttl为-1的记录集?

    我在aerospike中有很多记录 我想获取ttl为 1的记录 请提供解决方案 只是为了澄清 设置TTL 为 1 https github com aerospike aerospike client go blob master docs
  • 从函数调用动态 SQL

    我正在编写一个返回表的函数 有两个参数传递给该函数 并构建并执行查询并将其插入到返回的表中 但是我收到这个错误 只能从函数内执行函数和一些扩展存储过程 我不想使用存储过程 因为这是一个简单的实用函数 有谁知道这是否可以做到 我的函数编码如下
  • Delphi:平滑折叠/展开形式

    需要你的帮助 我一直在寻找 我在德尔福西雅图 试图平滑调整表单底部的大小 就我而言 调整大小 只是有点折叠 展开 如下所示 我怎样才能意识到这一点 我尝试过使用 TTimer procedure TForm1 Timer1Timer Sen
  • 如何在 python 中的不同终端窗口中运行函数/线程?

    我有一个这样的程序 from threading import Thread def foo1 arg print foo1 gt gt gt Something input foo1 gt gt gt Enter Something de
  • 运营商部分应用

    如果我想在字符末尾添加一个空格以返回列表 如果我不传递任何参数 我将如何通过部分应用程序来完成此操作 还有类型是 space Char gt Char 由于使用 和 运算符出现 解析错误 我在末尾添加空格时遇到问题 到目前为止我所拥有的是
  • GridSearchCV:每次函数完成循环时打印一些表达式

    假设你有一些功能function在Python中通过循环工作 例如 它可以是一个计算某个数学表达式的函数 例如x 2 对于数组中的所有元素 例如 1 2 100 显然这是一个玩具示例 是否可以编写这样的代码 每次function经过一个循环
  • 确定已编译Lua的编译器版本

    我有一些已编译的 LuaQ 我需要确定用于编译它的确切版本 有什么可能的方法吗 编译的脚本在文件开头有一个标头 4 bytes signature x1bLua 1 byte version 0x51 1 byte format 1 byt
  • 将带有非字符串关键字的 dict 传递给 kwargs 中的函数

    我使用具有签名功能的库f args kwargs 我需要在 kwargs 参数中传递 python dict 但 dict 不包含关键字中的字符串 f 1 2 3 4 Traceback most recent call last File

随机推荐