lua实现switch

 

先上代码:

 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

 

posted on 2016-10-03 15:40  飞天里欧斯  阅读(3521)  评论(0编辑  收藏  举报

导航