Lua的功能是冒号

时间:2015-08-20 23:58:10

标签: lua

我在完全理解lua语法时遇到了问题,所以虽然这个答案可能很简单,但也许一些授权参考资料会帮助我和其他人进一步学习。

function blah()

function classname:blah()

2 个答案:

答案 0 :(得分:8)

Aubergine18的帖子涵盖了答案,但我将从第一原则解释,以进一步澄清。

在Lua中,函数是值,就像字符串或数字一样。这个表达式:

function() end

创建一个函数值。您可以将此值分配给变量,就像使用任何其他值一样:

foo = function() end

Lua提供了各种快捷语法,也称为#34; syntax sugar",用于处理函数值。首先是:

function foo() end

这完全等同于:

foo = function() end

另一个是:

function bar.foo() end

这完全等同于:

bar.foo = function() end

在此示例中,bar是一个表,foo是该表中的键,我们创建的函数值是分配给该键的值。

请注意,如果您调用 foo:

bar.foo()

该函数无法使用密钥bar知道它已存储在表foo中。如果要将该函数视为对象bar上的方法,则需要以某种方式为其提供对bar的访问权限。这通常通过将bar作为第一个参数传递来完成。按照惯例,在Lua中,此参数名为self

function bar.foo(self) end

bar.foo(bar)

作为此约定的快捷方式,Lua通过:运算符提供以下语法糖:

function bar:foo() end

bar:foo()

这与前面的代码完全相同。

答案 1 :(得分:6)

使用冒号表示法调用函数时,如下所示:

foo:bar()

Lua在幕后对待它:

foo.bar(foo)

如果使用点表示法定义函数,则必须手动指定“self”参数:

function foo.bar(self) ... end

但是如果你使用冒号表示法,Lua会为你添加一个不可见的'self'参数:

function foo:bar() ... end

即使你没有看到自我论证,它也在幕后。

基本上冒号表示法只是让你的代码看起来更清晰的一种方法。

另请参阅:Lua: colon notation, 'self' and function definition vs. call