第一版是為 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但有些地方有所不同。
第四版針對 Lua 5.3,可在 Amazon 和其他書店買到。
購買這本書,您也同時協助 支援 Lua 專案


1.1 – 程式區塊

Lua 執行的每段程式碼,例如檔案或互動模式中的單一行,都是一個程式區塊。更具體地說,程式區塊只是一個陳述式序列。

每個陳述式後面都可以選擇性地加上分號。通常,我只使用分號來分隔寫在同一行中的兩個或多個陳述式,但這只是一個慣例。換行在 Lua 的語法中沒有作用;例如,以下四個程式區塊都是有效且等效的

    a = 1
    b = a*2
    
    a = 1;
    b = a*2;
    
    a = 1 ; b = a*2
    
    a = 1   b = a*2    -- ugly, but valid

程式區塊可以像「hello world」範例中一樣簡單,只有一個陳述式,也可以由陳述式和函式定義(實際上是指定,我們稍後會看到)組成,例如階乘範例。程式區塊可以任意大。由於 Lua 也用作資料描述語言,因此數個 MB 的程式區塊並不少見。Lua 解譯器對於大型程式區塊完全沒有問題。

您不必將程式寫成檔案,也可以在互動模式下執行獨立的解譯器。如果您在沒有任何引數的情況下呼叫 Lua,您會看到它的提示

    Lua 5.0  Copyright (C) 1994-2003 Tecgraf, PUC-Rio
    >
之後,您鍵入的每個指令(例如 print "Hello World")都會在您按下 <enter> 之後立即執行。若要離開互動模式和解譯器,只需鍵入檔案結束(在 Unix 中為 ctrl-D,在 DOS/Windows 中為 ctrl-Z),或從作業系統函式庫呼叫 exit 函式(您必須鍵入 os.exit()<enter>)。

在互動模式中,Lua 通常會將你輸入的每一行視為一個完整的區塊來解釋。然而,如果它偵測到該行無法形成一個完整的區塊,它會等待更多輸入,直到它有一個完整的區塊。當 Lua 正在等待行延續時,它會顯示一個不同的提示(通常為 >>)。因此,你可以直接在互動模式中輸入多行定義,例如 factorial 函數。然而,有時將這些定義放入一個檔案中會更方便,然後呼叫 Lua 來執行該檔案。

你可以透過使用 -l 選項,將一系列的區塊作為引數傳遞給獨立的解釋器來執行它們。例如,如果你有一個包含單一陳述式 x=1 的檔案 a,以及另一個包含陳述式 print(x) 的檔案 b,則命令列

    prompt> lua -la -lb
將會執行 a 中的區塊,然後執行 b 中的區塊,它會印出預期的 1。(-l 選項實際上會呼叫 require,它會在特定路徑中尋找檔案。因此,如果此路徑不包含目前目錄,則前一個範例將無法運作。我們將在 第 8.1 節 中更詳細地討論 require 函數。)

你可以使用 -i 選項來指示 Lua 在執行給定的區塊後開始一個互動式工作階段。像這樣的命令列

    prompt> lua -i -la -lb
將會執行 a 中的區塊,然後執行 b 中的區塊,然後提示你進行互動。這對於除錯和手動測試特別有用。在本章的最後,我們將看到獨立解釋器的其他選項。

連結區塊的另一種方式是使用 dofile 函數,它會立即執行一個檔案。例如,你可能有一個檔案 lib1.lua

    -- file 'lib1.lua'
    
    function norm (x, y)
      local n2 = x^2 + y^2
      return math.sqrt(n2)
    end
    
    function twice (x)
      return 2*x
    end
然後,在互動模式中,你可以輸入
    > dofile("lib1.lua")   -- load your library
    > n = norm(3.4, 1.0)
    > print(twice(n))      --> 7.0880180586677

當你在測試一段程式碼時,dofile 函式也很有用。你可以使用兩個視窗:其中一個是包含你的程式碼的文字編輯器(例如在檔案 prog.lua 中),另一個是在互動模式下執行 Lua 的主控台。在你對程式碼進行修改並儲存後,你在 Lua 主控台中執行 dofile("prog.lua") 以載入新的程式碼;然後你可以執行新的程式碼,呼叫其函式並列印結果。