Lua程式設計隨筆(5)

2021-09-24 11:50:43 字數 1455 閱讀 6233

深入函式

在lua中,函式是作為第一類的對待的,即,可以儲存到變數,可以作為返回值,可以作為函式的形參

事實上,在lua中,函式都是匿名函式,所謂的函式名其實是持有這個函式的變數,

如function foo(x)

return 2*x;

end和

foo=function (x) return 2*x end

是等價的

closure 閉合函式

這個概念花了有點久的時間才弄清楚

閉合函式是指 乙個函式之中的內部函式,使用了該函式的區域性變數,那麼這個區域性變數的值不會隨著內次呼叫而初始化

即  函式+區域性變數+呼叫了區域性變數的內部函式=閉合函式

例如fuction addnumber()

local i=0;             //區域性變數

return funtion ()  //內部函式

i=i+1;    //使用了區域性變數

return i;

end;

endadn=addnumber();

print(adn())    =>1

print(adn())    =>2

addnumber中的區域性變數i並沒有在每次呼叫的過程中重新置0;這種用法可以用於迭代器之中,或者一連串類似的但是變動不大的操作中

另外,當另外乙個變數持有這個引數的時候,函式會賦予引數新的閉合函式

如adn=addnumber();

adc=addnumber();

print(adn())    =>1

print(adc())    =>1

print(adn())    =>2

同時因為函式的第一類特性,可以用這種方式來給函式重新定義

例如do

local oldsin=math.sin;

math.sin=funtion (x)

return oldsin(2*x)

endend

先將舊的函式賦值給乙個變數,然後使用新的實現方式來實現,那麼這樣就避免了直接呼叫舊的函式,必須通過新的函式來訪問舊的函式,因為函式的呼叫本身是沒有限制的,這個就可以創造乙個限制的條件

以為函式的第一類特性,函式甚至可以做為table的元素

例如tbl={}

tbl.foo=funtion (x,y) return x+y end

tbl.goo=funtion (x,y) return x*y end

或者funtion tbl.foo(x,y) return x+y end

funtion tbl.goo (x,y) return x*y end

尾呼叫function f() return g() end

當乙個函式的返回值是另外乙個函式時,且在呼叫結束後沒有其他操作,那麼這一操作不會耗費棧空間,即,不會儲存尾函式的的空間,因為不會產生多餘的空間,所以在使用遞迴的時候不用擔心遞迴次數過多而導致棧溢位

Lua程式設計讀書 隨筆

lua中的 操作符的定義與其他語言的中的大致相似,規則如下 a b a floor a b b 計算的結果型別是根據第二個引數來的,例如 x math.pi x x 0.01 3.14 x x 1 3 另外 x 1 得到的結果是小數的部分,對於負數同樣取模是有效的 操作符 用於相等性測試,操作符 用...

核心程式設計隨筆5

note 0 windows提供了乙個作業 job 核心物件,它允許你將程序組合在一起並建立乙個 沙箱 來限制程序能夠做什麼.最好將作業物件想象成乙個程序容器.但是,即使作業中只包含乙個程序,也是非常有用的,因為這樣可以對程序施加平時不能施加的限制.note 1 以下的startrestricted...

lua學習隨筆 1

最近在用lua寫遊戲,用的是quick cocos2dx,研究了一下它的機制,或者說是tolua 的機制吧,怕以後忘了,寫在這兒做下記錄。首先,lua最強大的型別就是table,它可以儲存任何變數,number boolean string,甚至可以儲存table。table是乙個hash表,也就是...