【问题标题】:strange construct in LuaLua中的奇怪构造
【发布时间】:2013-09-05 05:45:33
【问题描述】:

我正在学习 Lua,遇到了以下结构:

button.action = function() buttonPressed() end

一样吗
button.action = buttonPressed() end

?

我知道 button.action 被分配了一个由 buttonPressed() 返回的值,但是为什么要像这样将它包装到匿名函数中呢?

【问题讨论】:

  • 您的第二个 sn-p 看起来不正确或不完整。有一个 end 用于关闭块范围,但没有启动它。你确定这是完整的代码吗?
  • 你说得对,谢谢。现在我明白了它是如何以及为什么是错误的。我从一个工作片段进行了更改,却没有意识到在这种情况下必须删除“结束”。

标签: function lua anonymous-function


【解决方案1】:

这个:

button.action = function() buttonPressed() end

(几乎)与此相同:

button.action = buttonPressed

但请注意末尾没有括号。

正如@hjpotter92 所说,主要区别在于buttonPressed 可以返回某些内容,而button.action 则不会。

【讨论】:

  • 还有一个更大的区别。前者会依赖buttonPressed的值的未来变化,后者不会依赖。
【解决方案2】:

“我知道 button.action 被分配了一个由 buttonPressed() 返回的值,但是为什么要像这样将它包装到匿名函数中呢?”

你错了。声明:

button.action = function() buttonPressed() end

分配给button.action 一个匿名函数,当调用该函数时,将依次执行调用buttonPressed()。请注意,匿名函数不返回任何内容,因此仅因其副作用而调用它。这是回调的常见习语。您使用匿名函数来延迟某些代码的执行(在这种情况下,只有对buttonPressed 的调用),直到您需要执行它。

鉴于您的 sn-p 的名称,我猜想这段代码设置了按下某个按钮时要执行的操作。当按钮被按下时,动作就会被触发(在代码中的某个地方会有一个像button.action() 这样的调用,它调用存储在button.action 中的匿名函数)并执行调用buttonPressed()

【讨论】:

  • 谢谢,这是有道理的(我认为)。我仍然需要仔细考虑并进行实验以更好地掌握它。
【解决方案3】:

Lua 本身没有私有/受保护变量的概念。不同的程序员使用不同的方法来模拟相同的结果。

至于你对结构的解释; end 语句不匹配。即使忽略该语法错误,button.action 的值也不会是 buttonPressed 函数返回的值。 Here's a small demonstration给你看:

x = function() return 'hi' end
y = function() x() end
z = x()
print( y, z, y(), 1 )

如您所见,这很可能是程序员合并“受保护”函数或类的方式(在我看来)。

【讨论】:

  • 感谢您的演示,它帮助清除了很多东西。我相信在这种情况下,目标是拥有一个通用按钮类,并能够在创建按钮实例时分配按钮执行的操作。因此,此构造在类代码之外用于将所需操作存储在类属性之一中,而不是在类内部定义将执行的操作,从而失去灵活性。
猜你喜欢
  • 2015-05-07
  • 2019-03-09
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
相关资源
最近更新 更多