Lua中的 ":" 意味着什么?

3

我是 Lua 的新手,正在参与一个项目,遇到了一个问题,就是我不理解代码中的 ":" 符号。在手册中也没有找到相关解释。例如,我应该如何理解以下代码:

res:template{
        main = 'functionform.html',
        functionjs = '_functionform.js',
        functionform = '_functionform.html'
    }
3个回答

6

在Lua中,冒号操作符PIL是一种语法糖。它用于面向对象的Lua中,使普通函数调用看起来更像方法调用。它所做的就是在调用函数时将对象作为self参数传递。看这个例子:

a.myFunction(a, 'foo')

这相当于:

a:myFunction('foo')

在你的例子中,方法调用省略了括号,因为它的唯一参数是一个表PIL,所以没有冒号运算符的函数调用将类似于:

res.template(res, {
        main = 'functionform.html',
        functionjs = '_functionform.js',
        functionform = '_functionform.html'
    })

所以你可以看到,这个小语法糖非常方便。


5
第2.5.8节的手册中可以得知,Lua中的函数调用遵循以下语法:
functioncall ::= prefixexp args
在函数调用中,首先会对prefixexp和args进行求值。如果prefixexp的值为函数类型,则使用给定参数调用该函数。否则,将调用前缀表达式“调用”元方法(metamethod),该元方法的第一个参数是prefixexp的值,后跟原始的调用参数(参见§2.8)。
以下形式可用于调用“方法”:
functioncall ::= prefixexp `:´ Name args
调用v:name(args)的语法糖等同于v.name(v,args),只不过v只被计算一次。
因此,res:template{}res.template(res, {})相同。

3
冒号运算符在方法定义中添加一个额外的“隐藏”参数,在方法调用中添加一个参数。(例如,this/self)

http://www.lua.org/pil/16.html

调用模板函数时,会提供隐藏参数“self”,通过它可以访问定义该函数的对象。该对象是指函数所在的对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接