第一版是為 Lua 5.0 編寫的。儘管對後續版本仍有很大的關聯性,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店買到。
購買本書,您還可以協助 支援 Lua 專案


4.2 – 區域變數和區塊

除了全域變數,Lua 還支援區域變數。我們使用 local 陳述式建立區域變數

    j = 10         -- global variable
    local i = 1    -- local variable
與全域變數不同,區域變數的範圍僅限於宣告它們的區塊。區塊是控制結構的主體、函式的本體或區塊(宣告變數的檔案或字串中的程式碼)。
    x = 10
    local i = 1        -- local to the chunk
    
    while i<=x do
      local x = i*2    -- local to the while body
      print(x)         --> 2, 4, 6, 8, ...
      i = i + 1
    end
    
    if i > 20 then
      local x          -- local to the "then" body
      x = 20
      print(x + 2)
    else
      print(x)         --> 10  (the global one)
    end
    
    print(x)           --> 10  (the global one)
請注意,如果您在互動模式中輸入此範例,它將無法如預期般運作。第二行local i = 1本身就是一個完整的區塊。當您輸入這行時,Lua 會執行它並在下一行開始一個新的區塊。到那時,local 宣告已超出範圍。要在互動模式中執行此類範例,您應該將所有程式碼包含在 do 區塊中。

只要有可能,使用區域變數是很好的程式設計風格。區域變數有助於您避免使用不必要的變數名稱來弄亂全域環境。此外,存取區域變數比存取全域變數更快。

Lua 將區域變數宣告視為陳述式處理。因此,您可以在任何可以撰寫陳述式的區塊中撰寫區域宣告。範圍從宣告後開始,一直持續到區塊結束。宣告可能包含初始指派,其運作方式與傳統指派相同:額外的值會被捨棄;額外的變數會取得 nil。特別是,如果宣告沒有初始指派,它會將所有變數初始化為 nil

    local a, b = 1, 10
    if a<b then
      print(a)   --> 1
      local a    -- `= nil' is implicit
      print(a)   --> nil
    end          -- ends the block started at `then'
    print(a,b)   -->  1   10

Lua 中常見的慣用語法為

    local foo = foo
此程式碼會建立一個區域變數 foo,並將其初始化為全域變數 foo 的值。當區塊需要保留 foo 的原始值,即使稍後其他函數變更全域 foo 的值時,此慣用語法會很有用;它也會加快對 foo 的存取速度。

由於許多語言會強制您在區塊(或程序)的開頭宣告所有區域變數,因此有些人認為在區塊中間使用宣告是一種不良習慣。恰恰相反:僅在需要時宣告變數,您就很少需要在沒有初始值的情況下宣告變數(因此您很少忘記初始化變數)。此外,您可以縮短變數的範圍,這會增加可讀性。

我們可以使用關鍵字 do-end 明確界定一個區塊,並將其括起來。當您需要更精細地控制一個或多個區域變數的範圍時,這些 do 區塊會很有用

    do
      local a2 = 2*a
      local d = sqrt(b^2 - 4*a*c)
      x1 = (-b + d)/a2
      x2 = (-b - d)/a2
    end          -- scope of `a2' and `d' ends here
    print(x1, x2)