在lua中,函式是一種對語句和表示式進行抽象的主要機制。函式既可以完成某項特定
的任務,也可以只做一些計算並返回結果;
lua為物件導向式的呼叫也提供了一種特殊語法——冒號操作符。表示式o.foo(o,x)的
另一種寫法是o:foo(x),冒號操作符使呼叫o.foo時將o隱含地作為函式的第乙個引數;
乙個lua程式既可以使用lua編寫的函式,又可以呼叫以c語言編寫的函式。
所有lua標準程式庫中的函式都是用c語言寫的;
函式中形式引數的使用方式與區域性變數相似,它們是由呼叫函式時的實際引數初始化
的。呼叫函式時提供的實參數量可以與形參數量不同,lua會自動調整實參的數量以
匹配參數列的要求,即"若實參多於形參,則捨棄多餘的實參;若實參不足,則多餘
的形參初始化為nil";但這種行為可能會導致一些程式設計錯誤,盡量不要去這麼做;
5.1多重返回值
lua具有一項非常與眾不同的特徵,即允許函式返回多個結果,只需在return關鍵字
後列出所有的返回值即可;
lua也會調整乙個函式的返回值數量以適應不同的呼叫情況;
只有當乙個函式呼叫時一系列表示式中的最後乙個元素時,才能獲得它的所有返回值;
這裡的「一系列表示式」表現為4中情況:多重賦值,函式呼叫時傳入的實參列表,table
的構造式 和return語句;
在多重賦值中:
如果乙個函式呼叫時最後乙個表示式,那麼lua會保留其盡可能多的返回值,用於
匹配賦值變數;
如果乙個函式沒有返回值或者沒有足夠多的返回值,那麼lua會用nil來補充缺失的值;
如果乙個函式呼叫不是一系列表示式的最後乙個元素,那麼只將產生乙個值;
如果乙個函式呼叫作為另乙個函式呼叫的最後乙個實參時,第乙個函式的所有返回值
都將作為實參傳入第二個函式,若第乙個函式出現在乙個表示式中時,lua會將其返回
值數量調整為1;例子 ——> print(foo2() .."x")
table構造式可以完整地接收乙個函式呼叫的所有結果,即不會有數量方面的調整;
不過這種行為只有當函式呼叫作為table的最後乙個元素時才會發生,而在其他位置
上的函式呼叫總是只產生乙個結果值;
如果乙個函式呼叫時作為return語句的最後乙個元素時會返回它的所有結果;
可以將乙個函式呼叫放入一對圓括號中迫使它只返回乙個結果;
乙個特殊的函式 ——unpack,它接受乙個陣列作為引數,並從下標1開始返回該陣列的所有
元素;unpack的一項重要用途體現在「泛型呼叫--genericcall」機制中;
泛型呼叫機制可以動態地以任何實參來呼叫任何函式;如果想呼叫任意函式f,而所有的引數
都在陣列a中,那麼可以這麼寫:
f(unpack(a))
unpack 將返回a中所有的值,這些值將作為函式f的實參。
unpack的lua實現(通過遞迴):
function unpack(t, i)
i = i or 1
if t[i] then
returnt[i], unpack(t, i+1)
endend
5.2變長引數
lua函式可以接受不同數量的實參;例如:
function add(...)
local s = 0
for i, v inipairs do
s = s + v
endreturn s
end參數列中的3個點(...)表示函式可接受不同數量的實參。當函式被呼叫時,它的所有引數會被收集到一起,
稱為這個函式的"變長引數";
乙個函式要訪問它的引數時仍需要3個點(...),此時這3個點是作為乙個表示式來使用的。
表示式"..."的行為類似於乙個具有多重返回值的函式,它返回的是當前函式的所有變長引數;
例如: local a, b, c = ...
具有變長引數的函式同樣也可以擁有任意數量的固定引數,但固定引數必須放在變長引數之前。
遍歷乙個函式的變長引數時只需要使用表示式,這就像訪問乙個table一樣;
但在某些特殊情況下,變長引數會包含一些故意傳入的nil,那麼此時就需要用函式select來訪問變長引數了。
呼叫select時,必須傳入乙個固定實參selector(選擇開關) 和 一系列變長引數。如果selector為數字n,那麼它
返回它的第n個可變實參;否則,selector只能為字串"#",這樣select會返回變長引數的總數,其中包括nil;
例如:for i=1, select("#", ...) do
local arg =select(i, ...)
《迴圈體》
end了解lua5.0 與lua5.1 關於變長引數的不同!
5.3具名實參
lua的引數傳遞機制是具有位置性的,也就是說在呼叫乙個函式時實參是通過它在參數列中的位置與形參
匹配起來的。但有時通過名稱來指定實參也是很有用的。具體做法:將所有實參組織到乙個table中,
並將這個table作為唯一的實參傳給函式。如:
function rename(arg)
returnos.rename(arg.old,arg.new)
end函式rename的引數改為只接受乙個table型別的引數;在呼叫rename時,要注意lua中特殊的函式呼叫語法,
就是當實參只有乙個table構造式時,函式呼叫中的圓括號是可有可無的:
rename
第五章 函式
第五章 函式 1 函式的定義 shell函式定義可以放在 bash profile 檔案中,也可以在使用該函式的指令碼中,還可以在命令列中 通過 source 或 執行bash profile檔案,使修改能夠立即生效 function 函式名 declare f 顯示定義的函式清單 export f...
第五章 函式
在lua中,函式是對語句和表示式進行抽象的主要機制。即使呼叫函式時沒有引數,也必須要寫出一對空括號。一種特殊的例外情況 乙個函式若只有乙個引數,且此引數是乙個字面字串或table構造式,那麼圓括號別是可有可無的。print hello world dofile test.lua print a mu...
python第五章 Python學習(第五章)
記錄所有的名片字典 card list defshow menu 顯示資訊 print 50 print 歡迎使用 名片管理系統 v1.0 print print 1.新增名片 print 2.顯示全部 print 3.搜尋名片 print print 0.退出系統 print 50 defnew ...