2015-08-20 78 views
1

我有一个问题完全理解lua语法,所以虽然这个答案可能很简单,也许一些authorative引用将帮助我和其他人进一步学习。Lua功能与冒号

function blah() 

function classname:blah() 
+2

已在此解答:http://stackoverflow.com/questions/26576630/in-lua-what-is-the-difference-between-functions-that-use-and-functions-that/26577282#26577282 ..不完全是重复的,但应该关闭,我想。 – Josh

+2

可能的重复[什么是“:”在Lua中的意思](http://stackoverflow.com/questions/27110276/what-does-mean-in-lua) –

回答

4

当您使用冒号表示,像这样调用一个函数:

foo:bar() 

的Lua把它像这一幕后:

foo.bar(foo) 

如果你使用d来定义你的函数OT符号,你必须手动指定“自我”的说法:

function foo.bar(self) ... end 

但是如果你使用冒号表示,Lua中会添加一个不可见的“自我”参数给你:

function foo:bar() ... end 

即使尽管你没有看到自己的观点,但它在幕后。

基本上冒号符号只是一种让您的代码看起来更干净的方法。

参见:Lua: colon notation, 'self' and function definition vs. call

+0

为什么一些函数根本没有foo,他们只是把酒吧?那是什么意思?自我也指的是该类的一个实例?我对Lua来说很漂亮。为什么我需要自我? – CodeCamper

+0

如果你有foo.bar()或foo:bar(),那么这个函数只是'foo'表中的一个属性。它的功能并不重要...... 它们可以在本地定义__local函数bar()... end__,全局定义__function bar()... end__或定义为表的一个属性,__function foo.bar()... end__。 __self__的东西是不需要的,除非你需要它嘿。如果你不需要对表或对象的引用,那么你的函数就是属性,那么你就不需要使用冒号记号或自我。 – Aubergine18

5

Aubergine18的职位涵盖了答案,但我会从第一原理解释提供进一步的澄清。

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

function() end 

创建一个函数值。您可以指定这一个变量,就像你任何其他值:

foo = function() end 

Lua中提供了各种快捷语法,也被称为“语法糖”,与函数值的工作。首先是这样的:

function foo() end 

这是完全等同于:

foo = function() end 

另一种是:

function bar.foo() end 

这是完全等同于:

bar.foo = function() end 

在这个例子,bar是a表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() 

这是完全等同于以前的代码。

+0

上面代码示例中的小修改...应该是__bar:foo()__(使Lua自动将'bar'作为第一个参数传递给'foo'函数所需的冒号 – Aubergine18

+0

哎呀,谢谢。 – Mud