我有一个问题完全理解lua语法,所以虽然这个答案可能很简单,也许一些authorative引用将帮助我和其他人进一步学习。Lua功能与冒号
function blah()
和
function classname:blah()
我有一个问题完全理解lua语法,所以虽然这个答案可能很简单,也许一些authorative引用将帮助我和其他人进一步学习。Lua功能与冒号
function blah()
和
function classname:blah()
当您使用冒号表示,像这样调用一个函数:
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
为什么一些函数根本没有foo,他们只是把酒吧?那是什么意思?自我也指的是该类的一个实例?我对Lua来说很漂亮。为什么我需要自我? – CodeCamper
如果你有foo.bar()或foo:bar(),那么这个函数只是'foo'表中的一个属性。它的功能并不重要...... 它们可以在本地定义__local函数bar()... end__,全局定义__function bar()... end__或定义为表的一个属性,__function foo.bar()... end__。 __self__的东西是不需要的,除非你需要它嘿。如果你不需要对表或对象的引用,那么你的函数就是属性,那么你就不需要使用冒号记号或自我。 – Aubergine18
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()
这是完全等同于以前的代码。
上面代码示例中的小修改...应该是__bar:foo()__(使Lua自动将'bar'作为第一个参数传递给'foo'函数所需的冒号 – Aubergine18
哎呀,谢谢。 – Mud
已在此解答:http://stackoverflow.com/questions/26576630/in-lua-what-is-the-difference-between-functions-that-use-and-functions-that/26577282#26577282 ..不完全是重复的,但应该关闭,我想。 – Josh
可能的重复[什么是“:”在Lua中的意思](http://stackoverflow.com/questions/27110276/what-does-mean-in-lua) –