Lua閉包使用心得

jopen 10年前發布 | 9K 次閱讀 閉包 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

來自: http://www.cnblogs.com/JensenCat/p/5112420.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!