Lua局部變量和代碼塊

局部變量和代碼塊

    Lua語言中的變量在默認情況下是全局變量,所有的局部變量在使用前必須聲明。與全局變量不同,局部變量的生效範圍僅限於聲明它的代碼塊。一個代碼塊是一個控制結構的主體,或是一個函數的主體,或是一個代碼段:

x = 10 
local i = 1		-- 對於代碼段來說是局部的
while i <= x do
	local x = i * 2	--對於循環來說是局部的
	print(x)		-- 2,4,6...
	i = i + 1
end
if i > 20 then
	local x 			-- 對於"zhen"來說是局部的
	x = 20
	print(x + 2)		-- 如果測試成功會輸出22
else
	print(x)		-- 10(全局的)
end
print(x)

    請注意,上述示例在交互模式中不能正常運行。因爲在交互模式中,每一行代碼就是一個代碼段。一旦輸入示例的第二行,Lua語言解釋器就會直接運行它並在下一行開始一個新的代碼段。這樣,局部的聲明就超出了原來的作用範圍。解決這個問題的一種方式是顯示地聲明整個代碼塊,即將它放入一對do-end中。一旦輸入了do,命令就只會在遇到匹配的end時才結束,這樣Lua語言解釋器就不會單獨執行每一行的命令。
    當需要更好地控制某些局部變量的生效範圍時,do程序塊也同樣有用:

local x1 , x2
do
	local a2 = 2 * a2
	local d = (b^2 - 4*a*c)^(1/2)
	x1 = (-b + d)/a2
	x2 = (-b - d)/a2
end
print(x1,x2)

    儘可能地使用局部變量是一種良好的編程風格。首先,局部變量可以避免由於不必要的命名而造成全局變量的混亂;其次,局部變量還能避免同一程序中不同代碼部分中的命名衝突;再次,訪問局部變量比訪問全局變量更快;最後,局部變量會隨着其作用域的結束兒消失,從而使得垃圾收集器能夠將其釋放。
    鑑於局部變量優於全局變量,有些人就認爲Lua語言應該把變量默認視爲局部的。然而,把變量默認視爲局部的也有一些列的問題。一個更好的解決辦法並不是把變量默認視爲局部變量,而是在使用變量前必須先聲明。Lua語言的髮型版中有一個用於全局變量檢查的模塊strict.lua,如果視圖在一個函數中對不存在的全局變量賦值或者使用不存在的全局變量,將會拋出異常。
    局部變量的聲明可以包含初始值,其賦值規則與常見的多重賦值一樣:多餘的值被丟棄,多餘的變量被賦值爲nil。如果一個聲明中沒有賦值,則變量會被初始化爲nil:

local a , b = 1 , 10
if a < b then
	print(a)			-- 1
	local a 			-- '= nil' 是隱式的
	print(a)			-- nil
end
print(a,b)				-- 1, 10

Lua語言中有一種常見的用法:
local foo = foo
這段代碼聲明瞭一個局部變量foo,然後用全局變量foo對其賦值。這個用法在需要提高對foo的訪問速度時很有用。當其他函數改變了全局變量foo的值,而代碼段又需要保留foo的原始值時,這個用法也很有用,尤其是在進行運行時動態替換時。即使其他代碼把print動態替換成了而其他函數,在local print = print語句之前的所有代碼使用的還都是原先的print函數。
有些人認爲在代碼塊的中間位置聲明變量時一個不好的習慣,實際上恰恰相反,我們很少會在不賦初始值的情況下聲明變量,在需要時才聲明變量可以避免漏掉初始化這個變量。此外,通過縮小變量的作用域還有助於提高代碼的可讀性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章