Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带冒号的Lua函数_Lua - Fatal编程技术网

带冒号的Lua函数

带冒号的Lua函数,lua,Lua,我在完全理解lua语法时遇到了一个问题,因此虽然这个答案可能很简单,但一些权威参考资料可能会帮助我和其他人进一步学习 function blah() 及 使用冒号符号调用函数时,如下所示: foo:bar() Lua在幕后是这样对待它的: foo.bar(foo) 如果使用点符号定义函数,则必须手动指定“self”参数: function foo.bar(self) ... end 但是,如果使用冒号符号,Lua将为您添加一个不可见的“self”参数: function foo:bar(

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

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