Lua函数带有冒号

我对 lua 语法理解不够深入,所以尽管这个回答可能很简单,一些权威参考资料可能会帮助我和其他人进一步学习。

function blah()

function classname:blah()
点赞
用户5240636
用户5240636

当你使用冒号符号调用一个函数时,像这样:

foo:bar()

Lua 在幕后将其视为这样:

foo.bar(foo)

如果你使用点号符号定义函数,你需要手动指定 'self' 参数:

function foo.bar(self) ... end

然而,如果你使用冒号符号,Lua 将会为你添加一个不可见的 'self' 参数:

function foo:bar() ... end

即使你看不到 self 参数,它在幕后也是存在的。

基本上,冒号符号只是一种让你的代码更加清晰的方式。

参考资料:Lua:冒号符号、self 和函数定义与调用

2015-08-21 01:31:29
用户501459
用户501459

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()

这与之前的代码完全等效。

2015-08-21 17:52:14