我对lua语法的理解有些困难,因此希望得到一些权威参考资料来帮助我和其他人更好地学习。
function blah()
并且
function classname:blah()
我对lua语法的理解有些困难,因此希望得到一些权威参考资料来帮助我和其他人更好地学习。
function blah()
并且
function classname:blah()
Aubergine18的帖子已经回答了这个问题,但我会从最基本的原理解释一下,以提供更进一步的澄清。
在Lua中,函数是值,就像字符串或数字一样。这个表达式:
function() end
foo = function() end
Lua提供多种简写语法,也称为“语法糖”,用于处理函数值。第一个是这个:
function foo() end
foo = function() end
另一个是:
function bar.foo() end
这完全等同于:
bar.foo = function() end
bar
是一个表格,foo
是该表格中的一个键,而我们创建的函数值就是分配给该键的值。bar.foo()
foo
存储在表 bar
中的,如果你想将该函数作为对象 bar
的一个方法来处理,你需要以某种方式提供访问 bar
的权限。通常可以通过将 bar
作为第一个参数传递来完成。按照 Lua 的习惯,这个参数被命名为 self
。function bar.foo(self) end
bar.foo(bar)
作为该约定的一种快捷方式,Lua 通过 :
运算符提供了以下语法糖:
function bar:foo() end
bar:foo()
这与先前的代码完全等效。
bar:foo()
,假设 bar
被隐式传递到方法体中,那么我如何调用 bar
?它实际上是 self
吗? - IAbstractfunction bar:foo() end
直译为 function bar.foo(self) end
,因此 foo
无论你是否给它其他参数,都有一个名为 self
的第一个参数。bar:foo()
直译为 bar.foo(bar)
,所以在 foo
中,self
将包含 bar
。 - Mud当您使用冒号表示法调用函数时,就像这样:
foo:bar()
foo.bar(foo)
如果您使用点符号定义函数,则必须手动指定“self”参数:
function foo.bar(self) ... end
function foo:bar() ... end
即使您看不到self参数,它在幕后存在。
基本上冒号表示法只是一种让您的代码看起来更清洁的方法。