Lua筆記9 再論函式

2021-07-04 10:43:42 字數 2017 閱讀 2754

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 迭代字串中單詞...