Lua學習筆記 第五章 函式

2021-06-23 08:37:03 字數 2687 閱讀 6670

在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 ...