我正在学习 Lua 并遇到了以下构造:
button.action = function() buttonPressed() end
是不是一样
button.action = buttonPressed() end
?
我知道 button.action 被分配了一个由 buttonPressed() 返回的值,但是为什么要将它包装成这样的匿名函数呢?
我正在学习 Lua 并遇到了以下构造:
button.action = function() buttonPressed() end
是不是一样
button.action = buttonPressed() end
?
我知道 button.action 被分配了一个由 buttonPressed() 返回的值,但是为什么要将它包装成这样的匿名函数呢?
这个:
button.action = function() buttonPressed() end
(几乎)与此相同:
button.action = buttonPressed
但请注意末尾没有括号。
正如@hjpotter92 所说,主要区别在于它buttonPressed
可以返回一些东西而button.action
没有。
“我知道 button.action 被分配了一个由 buttonPressed() 返回的值,但为什么要把它包装成这样的匿名函数呢?”
你理解错了。该声明:
button.action = function() buttonPressed() end
分配给button.action
一个匿名函数,该函数在被调用时将依次执行调用buttonPressed()
。请注意,匿名函数不返回任何内容,因此仅因其副作用而调用它。这是回调的常见习语。您使用匿名函数来延迟某些代码的执行(在这种情况下,只有对 的调用buttonPressed
),直到您需要执行它。
鉴于您的代码段的名称,我猜这个代码设置了按下某个按钮时要执行的操作。当按钮被按下时,动作就会被触发(在代码中的某个地方会有一个类似button.action()
调用存储在 中的匿名函数button.action
的调用)并执行调用buttonPressed()
。
Lua 本身没有私有/受保护变量的概念。不同的程序员使用不同的方法来模拟相同的结果。
至于你对结构的解释;有一个不匹配的end
陈述。即使忽略该语法错误, 的值button.action
也不会是buttonPressed
函数返回的值。这是一个小演示向您展示:
x = function() return 'hi' end
y = function() x() end
z = x()
print( y, z, y(), 1 )
如您所见,这很可能是程序员合并“受保护”函数或类的方式(在我看来)。