閉合函式(closure)
看lua程式設定這本書的時候,其實感覺也就lua也就那樣,直到看到閉合函式這乙個塊
首先來說說函式,函式在lua中屬於第一類值,
其實對於函式而言,function a() ... end 和 a = function()...end 是等價的,
乙個函式的定義實際上就是一條賦值語句,這條語句首先建立乙個函式型別的值,然後再把這個值賦值給這個函式的變數。
可以把 function()...end 看成是乙個函式的構造式,就和table的構造式沒什麼區別。
function()...end 所以乙個匿名函式,a = function()...end實際操作就是將這個匿名函式賦值給了a,所以a就是這個函式名,等同於function a()...end
說完函式,在說說乙個概念,非區域性變數,
什麼叫非區域性變數呢,書面意思,就是說他不是乙個區域性的變數,但他也不是乙個全域性的變數
例如:function newcount()
local i = 0 -- 區域性變數 i
return function() --匿名函式
i = i + 1 --非區域性變數 i
endend
對於上面那個函式中那個返回的匿名函式來說,他裡面的那個變數i,他並不是乙個區域性的變數,但他也不是乙個全域性的變數,對於這種變數,lua給他的定義就是 非區域性變數
c1 = newcounter()
print(c1())
print(c1())
c2 = newcounter()
print(c2())
print(c1())
print(c2())
他的輸出結果為
為什麼第二次的c1()的結果會是2呢?這就是之前強調的 , 函式是lua的第一類值
就如同c++的int a = 0 ,是直接在棧中開闢一塊記憶體來存放a的值,直到釋放,
其實這個也一樣,c1 = newcounter() 其實就是開闢了乙個棧空間,之後的操作一直都是在這個棧裡面進行操作的,
也就是說第一次列印c1的時候,i 從 0 變成了 1,然後繼續列印c1,你會發現,i 變成2了,這是因為 c1所開闢的那個棧空間並沒有釋放,你的一切操作還是在原來的棧空間中操作的,棧空間中的i在第一次列印的時候就已經變成1了,所以再次列印的時候,棧空間中的i就變成了2
而c2 = newcounter()之後列印c2()結果為1,那是因為c2 = newcounter()又在棧中開闢了乙個新的空間,所以他們裡面的i的值其實是不一樣的值
lua基礎學習 閉合函式(closure)
先看 newcounter function add local i 0 counter function i i add return i endreturn counter endc1 newcounter 1 print c1 print c1 do local oldcounter newc...
lua 函式深入 閉合函式,區域性函式,尾呼叫
lua函式具有兩大特徵 函式作為第一類值,函式具有特定的詞法域 lexical scoping 所謂第一類值 代表函式和其他傳統型別的值是等價的 例如數字和字串 函式可以同他們一樣儲存在變數,table中,可以作為實參傳遞,可以作為函式返回值。對於第一類值,需要講明,函式和其他值一樣都是匿名的,是沒...
Lua學習筆記之函式
與主題無關 exp3預設為1 for var exp1 exp2 exp3 do 執行體 end標準庫中提供了幾種迭代器 io.lines 用於迭代檔案中每行 pairs 迭代table中元素 ipairs 迭代 陣列 元素 string.gmatch 迭代字串中單詞多重返回值 x y foo fo...