Lua:冒号符号、'self'和函数定义与调用

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

我认为我已经理解了它,直到我看到了这段代码:

在这里令我困惑的是,string.PatternSafe() 没有引用 'self',但代码似乎仍能正常工作。

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

经过几个小时的谷歌仍然没有弄清楚这两种情况具体发生了什么。我的当前假设如下:

  1. 如果使用冒号符号定义函数,则会插入一个隐形的 'self' 参数作为第一个参数
  2. 如果使用冒号符号调用函数,则插入到冒号前面的对象作为参数(因此成为该函数的第一个参数)
  3. 即使使用冒号符号定义函数,如果使用点符号调用它,它也不会插入对象作为第一个参数/参数

如果我的假设是正确的,那么还有一个额外的问题:确保函数被正确调用的最佳方法是什么?

点赞
用户258523
用户258523

你的所有假设都是正确的。

手册中的假设1:

冒号语法用于定义方法,也就是具有隐式额外参数 self 的函数。因此,语句

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

是语法糖,相当于

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

手册中的假设2:

调用 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)。

2015-08-18 19:32:52