gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:30:12 31 4
gpt4 key购买 nike

我对定义/调用 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

经过几个小时的谷歌搜索,我仍然无法弄清楚在这两种情况下究竟发生了什么。我目前的假设如下:
  • 如果使用冒号符号定义函数,则它会插入一个不可见的“self”参数作为第一个参数
  • 如果使用冒号符号调用函数,则将“:”前面的对象插入到参数中(因此成为函数的第一个参数)
  • 如果使用点表示法调用函数,那么即使它是使用冒号表示法定义的,它也不会将对象作为第一个参数/参数插入

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

    最佳答案

    你的假设都是正确的。

    来自 the manual 的假设 1 :

    The colon syntax is used for defining methods, that is, functions that have an implicit extra parameter self. Thus, the statement

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

    is syntactic sugar for

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


    假设 2 来自 the manual :

    A call v:name(args) is syntactic sugar for v.name(v,args), except that v is evaluated only once.



    假设 3 没有直接的手动部分,因为那只是普通的函数调用语法。

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

    所以在你的例子中:
    function string.PatternSafe( str )
    return ( str:gsub( ".", pattern_escape_replacements ) );
    end

    第一个参数是 str所以当函数被调用为 char:PatternSafe()是脱糖(通过假设 2)到 char.PatternSafe(char)刚刚路过 char到函数作为第一个参数(正如我已经说过的,是 str )。

    关于function - Lua:冒号、 'self' 和函数定义与调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32080972/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com