第一版是為 Lua 5.0 編寫的。儘管對後續版本仍有很大的關聯性,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店買到。
購買本書,您還可以協助 支援 Lua 專案。
![]() |
用 Lua 編寫程式 | ![]() |
第 1 部分。語言 第 4 章。陳述式 |
除了全域變數,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)
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |