第5章表示式
lua的函式一般將引數放到函式名後的圓括號中。特殊情況:乙個函式只有乙個引數,並且該引數是乙個字串或table構造式,那麼圓括號可有可無,例如:
print 「hello world」 -- print(「helloworld」)
dofile 『a.lua』 -- dofile(『a.lua』)
print [[a melti-line -- print([[amulti-line
message]] message]])
f -- f()
type {} -- type({})
lua提供了冒號操作符。表示式o.foo(o,x)的另一種寫法是o:foo(x),冒號操作符使呼叫o.foo時將o隱含地作為函式的第乙個引數。
lua程式中既可以使用lua編寫的函式,也可以呼叫用c語言寫的函式。
lua函式遵循「若實參多餘形參,則捨棄多餘的實行;若實參不足,則將多餘的形參初始化為nil」的規則。假設有如下函式:
function f(a, b) return a or b end
則以下幾種呼叫,實參與形參的對應關係為:
f(3) -- a = 3, b =nil
f(3, 4) -- a = 3, b = 4
f(3, 4, 5) -- a = 3, b = 4 (5被丟棄)
5.1多重返回值(multiple result)
lua具有一項非常與眾不同的特徵,允許函式返回多個結果。例如,用於在字串中定位乙個模式的函式string.find。若該函式在字串中找到了指定的模式,將返回匹配的起始字元和結尾字元的索引,這樣就需要使用多重賦值語句來接受函式的返回值。
使用者自定義的函式同樣可以返回多個結果,例如:
function maximum(a)
local mi = 1 --最大值的索引
local m = a[mi] -- 最大值
for i, var in ipairs(a) do
ifvar > m then
mi= i; m = var
end --end if
end -- endfor
return m, mi
end -- endfunction
print(maximum())
乙個函式具有多個返回值時,例如:functionfoo() return 「a」, 「b」 end
在語句print(foo().. 「x」)中,列印結果為ax。因為函式foo出現在乙個表示式中,lua將其返回值數量調整為1,用於參與字串連線操作。
table構造式可以完整的接受乙個函式返回的所有值:t = 即 t =
但若乙個table接受多個函式時,只有最後乙個函式的返回值全部接受,其餘的每個函式只接受乙個值:t= -- t =
lua的預定義函式unpack,它接受乙個陣列作為引數,並從下標1開始返回該陣列內的所有元素。原函式由c語言實現的,也可以通過遞迴實現一樣的效果:
function unpack (t, i)
i= i or 1
ift[i] then
returnt[i], unpack(t, i+1)
endend
a =
print(unpack(a))
5.2變長引數(variable number of arguments)
lua中的函式可以接受不同數量的實參。用三個點(…)表示該函式可以接受不同數量的實參。乙個函式要訪問它的變長引數時,仍需用到3個點(…)。例如:
function add (...)
local s = 0
fori, v in ipairs do
s= s + v
endreturns
end
print(add(3, 4, 10, 25, 12)) -- 54
5.3具名實參(named arguments)
函式os.rename用於檔名改名,如:os.rename( )。
第6章深入函式
在lua中,函式是一種「第一類值(first-class value)」,這表示在lua中函式與其他傳統型別的值(例如字串和數字)具有相同的權利。函式可以儲存到變數中或table中,可以作為實參傳遞給其他函式,還可以作為其他函式的返回值。
6.1closure(閉合函式)
在lua中,乙個函式可寫在另乙個函式裡,內部函式可以訪問外部函式中的區域性變數。
6.2非全域性的函式(non-global function)
將乙個函式儲存到乙個區域性變數中,即得到了乙個「區域性函式(local function)」。
6.3正確的尾呼叫(proper tail call)
所謂的「尾呼叫(tail call)」就是一種類似於goto的函式呼叫。當乙個函式呼叫是另乙個函式的最後乙個動作時,該呼叫才算是一條「尾呼叫」,例如:
function f(x) return g(x) end
中的g函式就是一條「尾呼叫」。在這種情況中,程式不需要返回那個「尾呼叫」所在的函式。所以在「尾呼叫」之後,程式也不需要儲存任何關於該函式的棧(stack)資訊了。當g返回時,執行控制權可以直接返回到f函式。使得在進行「尾呼叫」時不耗費任何棧空間。將這種現象稱為「尾呼叫消除」。
python核心程式設計第二版第二章學習筆記
一.python直譯器 在所有的互動示例中,你會看到python 的 主提示符 和次提示符 主提示符是直譯器告訴你它在 等待你 輸入下乙個語句 次提示符告訴你直譯器正在 等待你輸入當前語句的其它部分。核心筆記 在互動式直譯器中顯示變數的值 通常當你想看變數內容時,你會在 中使用print 語句輸出。...
LUA學習筆記(第5 6章)
x a or b 如果a為真則x a 如果a為假則x b print a b 任何非nil型別都會被連線為字串,輸出 多重返回值 local s,e string.find hello world wo print s e 自定義函式 function getmax arr local maxval...
《PHP程式設計(第二版)》樣章發布
昨天編輯來信告訴我 php程式設計 第二版 英文名programming php 的樣章已經在csdn上發布了,有興趣的朋友可以看看。樣章我是挑選的,本來想多選些章節的,但被告知通常只選四章呵呵。首先第一章是php創始人ra us lerdorf對php的介紹。陣列和字串是php最核心和強大的功能,...