先上代码:
1 function switch(val) 2 local function innerfunc(t) 3 for k,v in pairs(t) do 4 if k == val then 5 if type(v) == "function" then 6 return v() 7 elseif type(v) == "thread" then 8 return coroutine.resume(v) 9 else 10 return v 11 end 12 end 13 end 14 end 15 return innerfunc 16 end
之后可以这样用:
local function sayHello() print("hello") end local function sayNo() print("no") end local name = "leo" local ret = switch(name) { ["lee"] = sayNo,--此处value可以是任何类型:nil、number、function、table、thread、userdata、string、boolean,如果是function或者thread,则先执行再返回,其他类型直接返回 ["leo"] = sayHello, ["woof"] = function() print("woof") end, } --打印:hello
注意:
在switch中,如果使用["lee"] = print("no")代替["lee"] = sayNo会使“no”也被打印出来。
--[[
再提供一个方便的函数packfunc,他实现了把函数跟实参打包在一起的功能,返回值是一个function。
比如:
local prtNm = packfunc(print,"name")
prtNm() -- 打印:name
]]
1 function packfunc(func,...) 2 local _argsSuper = {...} 3 local _c1 = select("#",...) 4 local function innerFunc(...) 5 local args = {...} 6 local argsOut = {unpack(_argsSuper,1,_c1)} 7 for i,v in pairs(args) do 8 argsOut[_c1 + i] = v 9 end 10 return func(unpack(argsOut,1,table.maxn(argsOut))) 11 end 12 return innerFunc 13 end
于是,上面的switch语句可以简化如下:
1 local name = "leo" 2 3 swtich(name){ 4 5 ["lee"] = packfunc(print,"no"), 6 7 ["leo"] = packfunc(print,"hello"), 8 9 ["woof"] = packfunc(print,"woof"), 10 11 }
也可以switch number:
local age = 13 local ret = switch(age) { [1] = "baby", [13] = "boy", [33] = "man", } print(ret)--boy