lua中的函式是帶有詞法定界(lexical scoping)的第一類值(first-class values)。
第一類值指:在lua中函式和其他值(數值、字串)一樣,函式可以被存放在變數中,也可以存放在表中,可以作為函式
的引數,還可以作為函式的返回值。
詞法定界指:巢狀的函式可以訪問他外部函式中的變數。這一特性給lua提供了強大的程式設計能力。
lua中關於函式稍微難以理解的是函式也可以沒有名字,匿名的。當我們提到函式名(比如print),實際上是說乙個指向函
數的變數,像持有其他型別值的變數一樣:
a =
a.p("hello world") --> hello world
print = math.sin -- `print' now refers to the sine function
a.p(print(1)) --> 0.841470
sin = a.p -- `sin' now refers to the print function
sin(10, 20) --> 10 20
既然函式是值,那麼表示式也可以建立函式了,lua中我們經常這樣寫:
function foo (x) return 2*x end
這實際上是lua語法的特例,下面是原本的函式:
foo = function (x) return 2*x end
函式定義實際上是乙個賦值語句,將型別為function的變數賦給乙個變數。我們使用function (x) ... end來定義乙個函式和使用{}建立乙個表一樣。
table標準庫提供乙個排序函式,接受乙個表作為輸入引數並且排序表中的元素。這個函式必須能夠對不同型別的值(字串或者數值)按公升序或者降序進行排序。lua不是盡可能多地提供引數來滿足這些情況的需要,而是接受乙個排序函式作為引數(類似c++的函式物件),排序函式接受兩個排序元素作為輸入引數,並且返回兩者的大小關係,例如:
network = ,,,
,}
如果我們想通過表的name域排序:
table.sort(network, function (a,b)
return (a.name > b.name)
end)
以其他函式作為引數的函式在lua中被稱作高階函式(higher-order function),如上面的sort。在lua中,高階函式與普通函式沒有區別,它們只是把「作為引數的函式」當作第一類值(first-class value)處理而已。
下面給出乙個繪圖函式的例子:
function eraseterminal()
io.write("\27[2j")
end
-- writes an '*' at column 'x' , 'row y'
function mark (x,y)
io.write(string.format("\27[%d;%dh*", y, x))
end
-- terminal size
termsize =
-- plot a function
-- (assume that domain and image are in the range [-1,1])
function plot (f)
eraseterminal()
for i=1,termsize.w do
local x = (i/termsize.w)*2 - 1
local y = (f(x) + 1)/2 * termsize.h
mark(i, y)
endio.read() -- wait before spoiling the screen
end
將第一類值函式應用在表中是
lua實現物件導向和包機制的關鍵。
Lua中文教程學習筆記 5 再論函式
lua 中的函式是帶有詞法定界 lexical scoping 的第一類值 first class values 第一類值指 在 lua 中函式和其他值 數值 字串 一樣,函式可以被存放在變 量中,也可以存放在表中,可以作為函式的引數,還可以作為函式的返回值。詞法定界指 被巢狀的函式可以訪問他外部函...
10 c 再論建構函式
先父後兒 解釋 a,先呼叫父類的建構函式,如果有虛擬基類則先呼叫虛擬基類的建構函式,再呼叫一般基類的建構函式。b,父類構造函式呼叫完後再呼叫自己 本類中如果有物件成員,則先呼叫物件成員的建構函式,再呼叫本類的建構函式。class furniture int getweight void const ...
Lua學習筆記函式
數字型for 的格式,exp3預設為1 for var exp1 exp2 exp3 do 執行體 end泛型for迭代的型別,標準庫中提供了幾種迭代器 io.lines 用於迭代檔案中每行 pairs 迭代table中元素 ipairs 迭代 陣列 元素 string.gmatch 迭代字串中單詞...