我在完全理解lua语法时遇到了问题,所以虽然这个答案可能很简单,但也许一些授权参考资料会帮助我和其他人进一步学习。
function blah()
和
function classname:blah()
答案 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