Lua閉包使用心得
1.什么是閉包
支持閉包特性通常需要一個嵌套函數 , 通過執行嵌套函數來改變所在父函數的局部變量狀態 , 父函數保存調用上下文狀態 , 而嵌套函數負責修改狀態的改變 . (簡單來說就是得支持函數嵌套)
下面就是一個Lua閉包:
function counter()
local cnt = 0
--返回匿名函數也是可以的
local Closure = function() cnt=cnt+1 print("print:"..cnt) end
return Closure
end
function main()
local Closure = counter()
Closure() --print:1
Closure() --print:2
Closure() --print:3
end 2.閉包的作用
下面是一個java的類,getName方法獲取到了類對象的私有成員變量
class Person
{
private String name;
public String getName()
{
return name;
}
} 通過上面的方式可以獲取到一個類內部的私有屬性,同樣的,在lua中可以通過某個方法來獲取這個方法的局部變量,然后通過這個方法內的方法來讀取想要的變量值。
function func3()
local num3 = 44
function func4()
return num3
end
return func4
end
local func = func3();
print(func())
解釋:
1.在外部無法獲取到func3內部的局部變量,但是func3內部的局部方法func4卻可以獲取到,因此 返回一個func4的引用 ,這樣在外部通過這個func4就可以獲取到func3的內部變量。
2.雖然是繞了一個圈子,但是在方法外部卻通過這樣一個手段獲取到了內部的值。而這個方法內的局部方法func4就叫做閉包,按照很多書上的概念,這個方法搭建了方法內部與方法外部的橋梁,使得在外部也可以任意的獲取到方法內部的資源。
3.但是閉包會造成變量在內存中持久占用,因此會有一定的性能問題,最好不要輕易使用,即便使用也要在恰當的實際進行釋放。
3.游戲開發中的應用
--以下用cocos2dx中的Lua來舉例...
--2dx通過tolua++把類方法導出
--舉例api
--按鈕響應回調函數格式為:
--luaFunc(event)
--event為觸摸按下,觸摸移動,觸摸離開等事件
--lua中的API為:
--UIButton::addListenHandler(luaFunc)
--實際需求是我按鈕按下時,我需要改變按鈕自身的紋理...此時回調中卻沒有按鈕本身的對象(sender),怎么辦呢?
--利用閉包就輕松解決了
--下面是LUA實戰例子:一個testUI的頁面類
local testUI = testUI or {}
local testUI:onBtnClick(sender,event)
--可獲取的參數有:隱藏的self,btn,event
end
function testUI:initButton()
local btn = UIButton:create()
--重點來了
btn:addListenHandler(
function(event)
--使用閉包把self,btn都傳進去了....
self:onBtnClick(btn,event)
end
)
end
return testUI 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!