首页 > 代码库 > lua实现switch

lua实现switch

 

先上代码:

function switch(val)
  local function innerfunc(t)
    for k,v in pairs(t) do
      if k == val then
        if type(v) == "function" then
          return v()
        elseif type(v) == "thread" then
          return coroutine.resume(v)
        else
          return v
        end
      end
    end
  end
  return innerfunc
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

]]

function packfunc(func,...)
  local args = {...}
  local function innerfunc()
    return func(unpack(args))
  end
  return innerfunc
end

于是,上面的switch语句可以简化如下:

local name = "leo"

swtich(name){

  ["lee"] = packfunc(print,"no"),

  ["leo"] = packfunc(print,"hello"),

  ["woof"] = packfunc(print,"woof"),

}

也可以switch number:

local age = 13

local ret = switch(age) {

[1] = "baby",

[13] = "boy",

[33] = "man",

}

print(ret)--boy

lua实现switch