带冒号的Lua函数
我在完全理解lua语法时遇到了一个问题,因此虽然这个答案可能很简单,但一些权威参考资料可能会帮助我和其他人进一步学习带冒号的Lua函数,lua,Lua,我在完全理解lua语法时遇到了一个问题,因此虽然这个答案可能很简单,但一些权威参考资料可能会帮助我和其他人进一步学习 function blah() 及 使用冒号符号调用函数时,如下所示: foo:bar() Lua在幕后是这样对待它的: foo.bar(foo) 如果使用点符号定义函数,则必须手动指定“self”参数: function foo.bar(self) ... end 但是,如果使用冒号符号,Lua将为您添加一个不可见的“self”参数: function foo:bar(
function blah()
及
使用冒号符号调用函数时,如下所示:
foo:bar()
Lua在幕后是这样对待它的:
foo.bar(foo)
如果使用点符号定义函数,则必须手动指定“self”参数:
function foo.bar(self) ... end
但是,如果使用冒号符号,Lua将为您添加一个不可见的“self”参数:
function foo:bar() ... end
即使你看不到自相矛盾,它也在幕后
基本上,冒号符号只是一种让代码看起来更干净的方法
另请参见:Aubergine18的帖子涵盖了答案,但我将从第一原则进行解释,以提供进一步的澄清 在Lua中,函数是值,就像字符串或数字一样。这句话:
function() end
创建函数值。您可以将其分配给变量,就像分配任何其他值一样:
foo = function() end
Lua提供了各种快捷语法,也称为“语法糖”,用于处理函数值。第一个是:
function foo() end
这完全等同于:
foo = function() end
bar.foo = function() end
另一个是:
function bar.foo() end
这完全等同于:
foo = function() end
bar.foo = function() end
在本例中,bar
是一个表,foo
是该表中的一个键,我们创建的函数值是分配给该键的值
请注意,如果您调用foo:
函数无法知道它是使用键foo
存储在表bar
中的。如果要将该函数视为对象bar
上的方法,则需要以某种方式为其提供对bar
的访问。这通常是通过将bar
作为第一个参数来完成的。根据Lua中的约定,此参数命名为self
:
function bar.foo(self) end
bar.foo(bar)
作为此约定的快捷方式,Lua通过:
运算符提供以下语法:
function bar:foo() end
bar:foo()
这与前面的代码完全相同。为什么有些函数根本没有foo,而它们只是放了bar?那是什么意思?self是否也引用了该类的实例?我对Lua很陌生。为什么我需要self?如果您有foo.bar()或foo:bar(),那么函数只是“foo”表上的一个属性。把函数放在哪里并不重要。。。它们可以是本地定义的本地函数栏()。。。结束,全局定义的函数栏()。。。结束或定义为表的属性,函数foo.bar()。。。结束。自我的东西是不需要的,除非你需要它。如果您不需要引用您的函数所属的表或对象,则不需要使用冒号符号或self。在上面的最后一个代码示例中,进行了一些小的更正。。。应该是bar:foo()假设
bar
被静默地传递到方法体中,我如何调用bar
?它实际上是self
?@IAbstract是。function bar:foo()end
被逐字翻译成function bar.foo(self)结束
,所以foo
有一个名为self的第一个参数
,而不管您做(或不做)给它什么其他参数。bar:foo()
被逐字翻译成bar.foo(bar)
,所以在foo
的内部,self
将包含bar
。