Lua的功能是冒号

Cod*_*per 3 lua

我有一个问题完全理解lua语法,所以虽然这个答案可能很简单,但也许一些授权参考将帮助我和其他人进一步学习.

function blah()
Run Code Online (Sandbox Code Playgroud)

function classname:blah()
Run Code Online (Sandbox Code Playgroud)

Mud*_*Mud 8

Aubergine18的帖子涵盖了答案,但我会从第一原则解释,以提供进一步的说明.

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

function() end
Run Code Online (Sandbox Code Playgroud)

创建一个函数值.您可以将此值分配给变量,就像使用任何其他值一样:

foo = function() end
Run Code Online (Sandbox Code Playgroud)

Lua提供了各种快捷语法,也称为"语法糖",用于处理函数值.首先是:

function foo() end
Run Code Online (Sandbox Code Playgroud)

这完全等同于:

foo = function() end
Run Code Online (Sandbox Code Playgroud)

另一个是:

function bar.foo() end
Run Code Online (Sandbox Code Playgroud)

这完全等同于:

bar.foo = function() end
Run Code Online (Sandbox Code Playgroud)

在此示例中,bar是表,是该表foo中的键,我们创建的函数值是分配给该键的值.

请注意,如果你打电话给 foo:

bar.foo()
Run Code Online (Sandbox Code Playgroud)

该函数无法知道它是否bar使用密钥存储在表中foo.如果要将该函数视为对象的方法,则bar需要以bar某种方式为其提供访问权限.这通常通过bar作为第一个参数传递来完成.按照Lua的惯例,这个参数命名为self:

function bar.foo(self) end

bar.foo(bar)
Run Code Online (Sandbox Code Playgroud)

作为此约定的快捷方式,Lua通过:运算符提供以下语法糖:

function bar:foo() end

bar:foo()
Run Code Online (Sandbox Code Playgroud)

这与前面的代码完全相同.

  • @IAbstract 是的。`function bar:foo() end` 字面翻译为 `function bar.foo(self) end`,因此 `foo` 有一个名为 `self` 的第一个参数,无论您提供(或不)提供什么其他参数它。`bar:foo()` 字面翻译为 `bar.foo(bar)`,因此在 `foo` 内部,`self` 将包含 `bar`。 (3认同)

Aub*_*e18 6

使用冒号表示法调用函数时,如下所示:

foo:bar()
Run Code Online (Sandbox Code Playgroud)

Lua在幕后对待它:

foo.bar(foo)
Run Code Online (Sandbox Code Playgroud)

如果使用点表示法定义函数,则必须手动指定"self"参数:

function foo.bar(self) ... end
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用冒号表示法,Lua将为您添加一个不可见的"自我"参数:

function foo:bar() ... end
Run Code Online (Sandbox Code Playgroud)

即使你没有看到自我论证,它也在幕后.

基本上冒号表示法只是让你的代码看起来更干净的一种方法.

另请参阅:Lua:冒号,'self'和函数定义与调用