【发布时间】:2015-08-22 06:59:00
【问题描述】:
我在完全理解 lua 语法时遇到了问题,所以虽然这个答案可能很简单,但也许一些权威参考资料会帮助我和其他人进一步学习。
function blah()
和
function classname:blah()
【问题讨论】:
-
What does ":" mean in Lua 的可能重复项
标签: lua
我在完全理解 lua 语法时遇到了问题,所以虽然这个答案可能很简单,但也许一些权威参考资料会帮助我和其他人进一步学习。
function blah()
和
function classname:blah()
【问题讨论】:
标签: lua
Aubergine18 的帖子涵盖了答案,但我将从基本原理进行解释以提供进一步的说明。
在 Lua 中,函数是值,就像字符串或数字一样。这个表达式:
function() end
创建一个函数值。您可以将其分配给变量,就像您分配任何其他值一样:
foo = function() end
Lua 提供了各种快捷语法,也称为“语法糖”,用于处理函数值。第一个是这样的:
function foo() end
这完全等同于:
foo = function() end
另一个是:
function bar.foo() end
这完全等同于:
bar.foo = function() end
在本例中,bar 是一个表,foo 是该表中的一个键,我们创建的函数值是分配给该键的值。
请注意,如果您调用 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吗?
function bar:foo() end 直译为function bar.foo(self) end,因此foo 有一个名为self 的第一个参数,无论您提供(或不提供)什么其他参数。 bar:foo() 直译为bar.foo(bar),所以在foo 内部,self 将包含bar。
当你使用冒号调用函数时,像这样:
foo:bar()
Lua 在幕后这样对待它:
foo.bar(foo)
如果您使用点符号定义函数,则必须手动指定 'self' 参数:
function foo.bar(self) ... end
但是如果你使用冒号,Lua 会为你添加一个不可见的 'self' 参数:
function foo:bar() ... end
即使您没有看到 self 参数,它也存在于幕后。
基本上,冒号只是让代码看起来更简洁的一种方式。
另请参阅:Lua: colon notation, 'self' and function definition vs. call
【讨论】: