4

我正在学习 Lua 并遇到了以下构造:

button.action = function() buttonPressed() end

是不是一样

button.action = buttonPressed() end

?

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

4

3 回答 3

3

这个:

button.action = function() buttonPressed() end

(几乎)与此相同:

button.action = buttonPressed

但请注意末尾没有括号。

正如@hjpotter92 所说,主要区别在于它buttonPressed可以返回一些东西而button.action没有。

于 2013-09-02T12:24:18.813 回答
2

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

你理解错了。该声明:

button.action = function() buttonPressed() end

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

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

于 2013-09-02T16:57:36.817 回答
1

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

至于你对结构的解释;有一个不匹配的end陈述。即使忽略该语法错误, 的值button.action也不会是buttonPressed函数返回的值。这是一个小演示向您展示:

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

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

于 2013-09-02T11:48:44.690 回答