先上代码:
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