lua 函數的閉包

來源:互聯網
上載者:User
function newCounter()  local i = 0  return function()     -- anonymous function  i = i + 1   return i  endendc1 = newCounter()print(c1())  --> 1print(c1())  --> 2c2 = newCounter()print(c2())  --> 1print(c1())  --> 3print(c2())  --> 2print(newCounter()()) --> 1print(newCounter()()) --> 1print(newCounter()()) --> 1

P.S::如果返回的是匿名函數,則需要再加一個()以調用匿名函數的內容

c1、c2 是建立在同一個函數上,但作用在同一個局部變數的不同執行個體上的兩個不同的閉包。 
技術上來講,閉包指值而不是指函數,函數僅僅是閉包的一個原型聲明;儘管如此,在不會導致混淆的情況下我們繼續使用術語函數代指閉包。 

閉包在上下文環境中提供很有用的功能,如前面我們見到的可以作為進階函數(sort)的參數;作為函數嵌套的函數(newCounter)。這一機制使得我們可以在 Lua 的函數世界裡組合出奇幻的編程技術。閉包也可用在回呼函數中,比如在 GUI 環境中你需要建立一系列 button,但使用者按下 button 時回呼函數被調用,可能不同的按鈕被按下時需要處理的任務有點區別。具體來講,一個十進位計算機需要 10 個相似的按鈕,每個按鈕對應一個數字,可以使用下面的函數建立他們: 

function digitButton (digit)   return Button{  label = digit,    action = function ()     add_to_display(digit)     end  } end 

這個例子中我們假定 Button 是一個用來建立新按鈕的工具, label 是按鈕的標籤,action 是按鈕被按下時調用的回呼函數。(實際上是一個閉包,因為他訪問 upvalue digit)。digitButton 完成任務返回後,局部變數 digit 超出範圍,回呼函數add_to_display仍然可以被調用並且可以訪問局部變數
digit。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.