【问题标题】:Lua functions with colon带有冒号的 Lua 函数
【发布时间】:2015-08-22 06:59:00
【问题描述】:

我在完全理解 lua 语法时遇到了问题,所以虽然这个答案可能很简单,但也许一些权威参考资料会帮助我和其他人进一步学习。

function blah()

和

function classname:blah()

【问题讨论】:

标签: lua


【解决方案1】:

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()(使 Lua 自动将 'bar' 作为第一个参数传递给 ' 所需的冒号foo'函数。
  • 很好的解释。一个问题:如果我调用bar:foo(),因为bar 被静默传递到方法体中,我该如何调用bar?真的是self吗?
  • @IAbstract 是的。 function bar:foo() end 直译为function bar.foo(self) end,因此foo 有一个名为self 的第一个参数,无论您提供(或不提供)什么其他参数。 bar:foo() 直译为bar.foo(bar),所以在foo 内部,self 将包含bar。
【解决方案2】:

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

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

【讨论】:

  • 为什么有些函数根本没有 foo 而只是放了 bar?那是什么意思呢? self 也指的是类的一个实例?我对 Lua 非常陌生。为什么我需要自我?
  • 如果你有 foo.bar() 或 foo:bar() 那么这个函数只是 'foo' 表上的一个属性。将函数放在哪里并不重要...它们可以是本地定义的local function bar() ... end,全局定义的function bar() ... end 或定义为表的属性,function foo.bar() ... end。 self 的东西是不需要的,除非你需要它,呵呵。如果您不需要引用您的函数是其属性的表或对象,那么您不需要使用冒号或 self。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 2019-07-24
  • 1970-01-01
  • 2018-06-21
  • 2015-07-08
  • 1970-01-01
  • 2012-03-26
相关资源
最近更新 更多