第一版是為 Lua 5.0 編寫的。儘管在很大程度上仍然適用於後續版本,但仍有一些區別。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您還將幫助 支持 Lua 項目


5 – 函數

函數是 Lua 中語句和表達式抽象的主要機制。函數既可以執行特定任務(在其他語言中有時稱為程序子例程),也可以計算並傳回值。在第一種情況下,我們將函數呼叫用作語句;在第二種情況下,我們將其用作表達式

    print(8*9, 9/8)
    a = math.sin(3) + math.cos(10)
    print(os.date())
在這兩種情況下,我們都會寫一個用括號括起來的參數列表。如果函數呼叫沒有參數,我們必須寫一個空列表 () 來表示呼叫。此規則有一個特例:如果函數只有一個參數,並且此參數是字面量字串或表格建構函數,則括號是可選的
    print "Hello World"     <-->     print("Hello World")
    dofile 'a.lua'          <-->     dofile ('a.lua')
    print [[a multi-line    <-->     print([[a multi-line
     message]]                        message]])
    f{x=10, y=20}           <-->     f({x=10, y=20})
    type{}                  <-->     type({})

Lua 還提供了一個用於面向對象呼叫的特殊語法,即冒號運算子。o:foo(x) 這樣的表達式只是寫 o.foo(o, x) 的另一種方式,也就是說,呼叫 o.foo 並將 o 作為第一個額外參數添加。在 第 16 章 中,我們將更詳細地討論此類呼叫(和面向對象編程)。

Lua 程式所使用的函數可以在 Lua 和 C(或主機應用程式所使用的任何其他語言)中定義。例如,所有函式庫函數都是用 C 編寫的;但這個事實與 Lua 程式設計師無關。呼叫函數時,用 Lua 定義的函數和用 C 定義的函數之間沒有區別。

正如我們在其他範例中所見,函數定義有一個慣例語法;例如

    -- add all elements of array `a'
    function add (a)
      local sum = 0
      for i,v in ipairs(a) do
        sum = sum + v
      end
      return sum
    end
在該語法中,函數定義有一個名稱(在前一個範例中為 add)、一個參數列表和一個主體,它是一個語句列表。

參數的工作方式與區域變數完全相同,會使用函式呼叫中提供的實際參數來初始化。您可以使用與參數數量不同的參數數量來呼叫函式。Lua 會調整參數數量以符合參數數量,就像在多重指定中一樣:額外的參數會被捨棄;額外的參數會取得 nil。例如,如果我們有一個函式如下

    function f(a, b) return a or b end
我們將會有從參數到參數的下列對應
    CALL             PARAMETERS
       
    f(3)             a=3, b=nil
    f(3, 4)          a=3, b=4
    f(3, 4, 5)       a=3, b=4   (5 is discarded)
雖然這種行為可能會導致程式設計錯誤(在執行時期很容易發現),但它也很有用,特別是對於預設參數。例如,考慮下列函式,用於遞增全域計數器。
    function incCount (n)
      n = n or 1
      count = count + n
    end
此函式有 1 作為其預設參數;也就是說,呼叫 incCount(),沒有參數,會將 count 遞增 1。當您呼叫 incCount() 時,Lua 會先使用 nil 初始化 nor 會產生其第二個運算元;因此 Lua 會將預設 1 指定給 n