淺談lua指令碼類裝飾器裝飾器
阿新 • • 發佈:2019-01-29
最近剛進公司不久,學習了指令碼語言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
4、這已經是我們可以接受範圍,下面是一個以裝飾器的思維來寫的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
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,然後再往下呼叫