Lua程式設計 closure(閉合函數)

來源:互聯網
上載者:User

標籤:des   style   使用   os   io   re   

        若將一個函數寫在另一個函數之內,那麼這個位於內部的函數便可以訪問外部函數中的局部變數,這項特徵稱之為“詞法域”。

        假設有一個學生姓名的列表和一個對應於每個姓名的年級列表,需要根據每個學生的年紀來對他們的姓名進行排序。

names = {"Peter", "Paul", "Mary"}grades = {Mary = 10, Paul = 7, Peter = 8}table.sort(names, function(n1, n2)      return grades[n1, n2] --比較年級     end)      現在,假設要單獨建立一個函數來做這項工作:function sortbygrade(names,grades) table.sort(names, function(n1, n2)     return grades[n1] > grade[n2]  --比較年級    end)end注意:上例中傳遞給sort的匿名函數可以訪問參數grades,而grades是外部函數sortbygrade的局部變數。在這個匿名函數的內部,grades既不是全域變數也不是局部變數,將其稱為一個“非局部的變數”。因為函數是“第一類值”的原因,所以允許這樣訪問。

 

function newCounter()local i = 0return function ()  --匿名函數    i = i + 1    return i    endend c1 = newCounter()print(c1())  -->1print(c1())  -->2   這段代碼中,匿名函數訪問了一個“非局部的變數”i,該變數用於保持一個計數器。初看上去,由於建立變數i的函數已經返回,所以之後每次調用匿名函數時,i都應是已超出了作用範圍的,但是,Lua會以closure的概念來處理。   簡單的講,一個closure就是一個函數加上該函數所需訪問的所有“非局部變數”。如果再次調用newCounter,那麼它會建立一個新的局部變數i,從而也將得到一個新的closure。     c2 = newCounter()  print(c2())  --- >1  print(c1())  --- >3  print(c2()) --- >2  因此,c1和c2是同一個函數所建立的兩個不同的closure,它們各自擁有局部變數i的獨立執行個體。

         從技術上講,Lua中只有closure而不存在“函數”,因為函數本身就是一種特殊的closure【closure:指一個函數以及一系列這個函數會訪問到“非局部的變數”,因此若一個closure沒有那些會訪問的“非局部變數”,那他就是一個傳統概念中的“函數”】。

       Lua中函數是儲存在普通變數中的,因此可以輕易地重新定義某些函數,甚至是重新定義那些預定義的函數。通常當重新定義一個函數的時候,需要在新的實現中調用原來的那個函數。

 oldSin = math.sinmath.sin = function(x) return oldSin(x * math.pi/180) end假設要重新定義函數sin,使其參數能使用角度來代替原先的弧度。這個新函數就必須得轉換它的實參,並調用原來的sin函數完成真正的計算。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.