我有一个问题完全理解lua语法,所以虽然这个答案可能很简单,但也许一些授权参考将帮助我和其他人进一步学习.
function blah()
Run Code Online (Sandbox Code Playgroud)
和
function classname:blah()
Run Code Online (Sandbox Code Playgroud)
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)
这与前面的代码完全相同.
使用冒号表示法调用函数时,如下所示:
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)
即使你没有看到自我论证,它也在幕后.
基本上冒号表示法只是让你的代码看起来更干净的一种方法.
| 归档时间: |
|
| 查看次数: |
838 次 |
| 最近记录: |