Lua 學習筆記(五)函式

2022-03-25 02:13:28 字數 2523 閱讀 7223

函式的定義:在lua中,函式是一種對語句和表示式進行抽象的主要機制。

一、函式基本用法

在lua中,

1、函式既可以完成某項特定的任務。(被視為一條語句)

2、也可以只做一些計算並返回結果。(被視為一句表示式)

格式:function function_name( ... )    

-- body

end---- 等同於 

function_name=function( ... )  --body  end 

宣告:function關鍵字宣告函式。end 關鍵字定義函式體的結束位置。( ... )引數列表用於值傳遞。

呼叫:以上無論哪種用法都需要將所有引數放到一對圓括號中,即使呼叫函式沒有引數列表,也必須寫出一對空括號。

對於此規則只有一種特殊的例外情況:乙個函式若只有乙個引數,並且此引數是乙個字面字元或table構造式,那麼圓括號便是可有可無的。

二、多重賦值與多重返回值

定義:若實參多餘形參,則捨棄多餘的實參;若實參不足,則多餘的形參初始化為nil。

形式引數:由呼叫函式時的「實際引數」初始化的,用法與區域性變數相似。如

在lua中,會自動調整函式返回值的數量以適應不同的呼叫情況。

1、若函式呼叫作為一條單獨的語句時,lua會丟棄所有返回值。

2、若函式作為表示式中的一部分來呼叫時,lua只會保留函式的第乙個返回值。

3、只有當乙個函式呼叫是一系列表示式中的最後乙個元素(或僅有乙個元素)時。才能獲得函式的所有返回值。

特殊函式unpack:接受乙個陣列作為引數,並從下標1開始返回該陣列的所有元素。unpack的一項重要用途體現在「泛型呼叫」機制中,泛型機制可以動態的以任何實參來呼叫任何函式。

三、變長引數

在lua中函式還可以接受不同數量的實參。例如print函式,在呼叫時可以傳入乙個或多個實參。

函式的變長引數以 「...」三個點表示,函式如果要訪問變長引數時,使用「」表示式來訪問,這樣變長引數會以table表中的元素的形式存在,這就像訪問乙個table一樣,訪問所有變長引數。然而在某些特殊的情況下,變長引數中會有nil值,此時就需要使用select來訪問變長引數。

呼叫select時必須傳入乙個固定的實參select(選擇開關)和一系列變長引數。

格式     

1、select( index,... ) 返回從index下標開始一直到變長引數列表結尾的元素。

2、select( '#',... ) 返回變長引數列表的長度

四、閉合函式

定義:若將乙個函式寫在另乙個函式之內,那麼這個位於內部的函式便可以訪問外部函式中的區域性變數,這項特徵稱之為「詞法域」。

外部函式中的區域性變數在匿名函式內既不是全域性變數,也不是區域性變數,將其稱之為「非全域性變數」。

計數器的實現:

五、非全域性的函式

只要將乙個函式儲存到乙個區域性變數中,就能得到乙個「區域性函式,也就是說只能在其作用域中使用。也可以在table中使用函式定義,即函式作為table中的元素存在。如:

當讓lua還有一種宣告區域性函式的方法:

六、正確的尾呼叫

尾呼叫的定義:當乙個函式呼叫是另乙個函式的最後乙個動作時,該呼叫是一條「尾呼叫」。

function f( x ) return g( x ) end

尾呼叫的意義:當f函式呼叫完g函式後就再沒有可執行的工作時,程式就不需要返回那個g所在的函式了。所以在尾呼叫之後程式也不需要儲存任何關於該函式的棧資訊了。當g返回時,執行控制權可以直接返回到呼叫f的那個點上。這種實現稱為支援「尾呼叫消除」。

因此由於「尾呼叫」不會耗費棧空間,所以乙個程式可以擁有無數巢狀的「尾呼叫」而不用擔心造成棧溢位。必須明確確認尾呼叫:

Lua學習筆記 第五章 函式

在lua中,函式是一種對語句和表示式進行抽象的主要機制。函式既可以完成某項特定 的任務,也可以只做一些計算並返回結果 lua為物件導向式的呼叫也提供了一種特殊語法 冒號操作符。表示式o.foo o,x 的 另一種寫法是o foo x 冒號操作符使呼叫o.foo時將o隱含地作為函式的第乙個引數 乙個l...

Lua 學習筆記(五) 語句

一 賦值 多重賦值 每個值或每個變數之間以逗號分隔 例如 a,b 10,20 lua先對等號右邊的所有元素求值,然後才執行賦值。二 區域性變數和塊 local建立區域性變數,作用域僅限於宣告它們的程式塊。三 控制結構 1.if then else end 例如 2.for 數值型for for va...

Lua學習筆記函式

數字型for 的格式,exp3預設為1 for var exp1 exp2 exp3 do 執行體 end泛型for迭代的型別,標準庫中提供了幾種迭代器 io.lines 用於迭代檔案中每行 pairs 迭代table中元素 ipairs 迭代 陣列 元素 string.gmatch 迭代字串中單詞...