举一个错误的Lua使用闭包的例子
时间: 2024-02-16 11:04:18 浏览: 85
关于lua的栈使用等问题,示例
一个错误的Lua使用闭包的例子是在循环中使用闭包来创建函数。例如,考虑以下代码:
```lua
for i = 1, 5 do
local button = Widget:createButton("Button " .. i)
button:setOnClick(function()
print("Button " .. i .. " clicked")
end)
container:addChild(button)
end
```
这个代码块将创建五个按钮,并为每个按钮设置一个单击事件处理函数。但是,由于Lua中函数作用域的特性,每个按钮的单击事件处理函数将共享同一个`i`变量,它的值在循环结束时为6。因此,当任何一个按钮被单击时,控制台将记录“Button 6 clicked”,而不是预期的“Button 1 clicked”、“Button 2 clicked”等等。
正确的解决方法是使用闭包来创建一个新的作用域,以便在每个按钮的事件处理函数中捕获当前的`i`值。例如:
```lua
for i = 1, 5 do
local button = Widget:createButton("Button " .. i)
button:setOnClick((function(i)
return function()
print("Button " .. i .. " clicked")
end
end)(i))
container:addChild(button)
end
```
这个代码块将为每个按钮创建一个新的作用域,并在每个作用域中捕获当前的`i`值。现在,当任何一个按钮被单击时,控制台将记录正确的按钮编号。
阅读全文