1. 程式人生 > >淺談lua指令碼類裝飾器裝飾器

淺談lua指令碼類裝飾器裝飾器

最近剛進公司不久,學習了指令碼語言Lua,今天重新理解了下裝飾器,感覺蠻簡單的,就是把一個函式的功能稍微修飾下。

1、先看這個簡單程式,求幾個數的最大值。

local function my_max( ... )
	return math.max( ... )
end

print(my_max(1,2,3))
2、假設輸入的值不是村數字的話,這時候應該報錯,那該怎麼實現呢
local function my_max( ... )
	local input = { ... }
	for key, value in pairs(input) do
		if type(tonumber(value)) ~= 'number' then
			print('invalid input at position ' .. tostring(key))
			return 0
		end
	end
    return math.max( ... )
end

print(my_max( 1,2,3 ))

print(my_max(1,'x',3))

輸出結果:
3
invalid input at position 2
0
3、其實到上面我們就已經滿足了需求,一般情況我沒會寫成如下重構程式碼:
local function isMyInputValid( ... )
	local input = { ... }
	for key, value in pairs(input) do
		if type(tonumber(value)) ~= 'number' then
			print('valid input at positon ' .. tostring(key))
			return false
		end
	end
	return true
end

local function my_max( ... )
	if not isMyInputValid( ... ) then
		return 0
	end
	return math.max( ... )
end

print(my_max( 1,2,3 ))

print(my_max(1,'x',3))

輸出結果:
3
valid input at positon 2
0
4、這已經是我們可以接受範圍,下面是一個以裝飾器的思維來寫的
local function dec(func)
	local function _dec_in(...)
		local input = { ... }
		for key, value in pairs(input) do
			if type(tonumber(value)) ~= 'number' then
				print('invalid input at position ' .. tostring(key))
				return 0
			end
		end
		return func( ... )
	end
	return _dec_in
end

local function my_max( ... )
	return math.max( ... )
end

my_max = dec(my_max)

print(my_max(1,2,3))
print(my_max(1,'x',3))

輸出結果:
3
invalid input at position 2
0
my_max = dec(my_max) 可以理解成 my_max = _dec_in,然後再往下呼叫