do-end 代碼塊主要是解決變量作用域問題。例如,下面這個(gè)示例代碼將輸出什么呢?
local x = 10
if x > 0 then
local x = 17
print(x) -- output: 17
end
print(x) -- output: 10
這里出現(xiàn)的本地變量,Lua 使用標(biāo)準(zhǔn)詞法作用域,所以這里 lua 的變量可以按照思維習(xí)慣輸出。這么做有下面幾個(gè)原因:
local i = 8
do
local a = i
x1 = a + 1
end -- scope of `a` ends here
print(x1) -- output: 9
print(a) -- output: nil
沒有 do-end 塊,輸出的結(jié)果就不一樣了。
local i = 8
local a = i
x1 = a + 1
print(x1) -- output: 9
print(a) -- output: 8
這里做一些有趣的嘗試,對于隱藏變量,看下面三個(gè)示例:
-- 本地變量外部函數(shù)
local func
do
local a = 0
func = function(inc)
a = a + inc
return a
end
end
print(func(1)) -- output: 1
print(func(2)) -- output: 3
print(func(3)) -- output: 6
-- 全局函數(shù)
do
local a = 0
function func(inc)
a = a + inc
return a
end
end
print(func(1)) -- output: 1
print(func(2)) -- output: 3
print(func(3)) -- output: 6
-- 方法
local tbl = {}
do
local a = 0
function tbl.func(self, inc)
a = a + inc
return a
end
end
print(tbl:func(1)) -- output: 1
print(tbl:func(2)) -- output: 3
print(tbl:func(3)) -- output: 6
那么哪一種更好呢?如果只從 Lua 語言角度看,貌似已經(jīng)有點(diǎn)難做出選擇。但是考慮不同開發(fā)語言之間的通用,這三個(gè)風(fēng)格都不足夠通用。 所以這里筆者更推薦下面的方式實(shí)現(xiàn)上面的邏輯。
-- 類方式
local tbl = { a = 0 }
function tbl.func(self, inc)
self.a = self.a + inc
return self.a
end
print(tbl:func(1)) -- output: 1
print(tbl:func(2)) -- output: 3
print(tbl:func(3)) -- output: 6