- 1,688
- 1,548
Описание: ещё один оператор switch, но наделенный небольшими сверхспособностями.
Код:
Пример:
Код:
Lua:
local function switch(value)
-- Утилита для вызова функции, или возврата значения, что функцией не является.
local function call_or_return(var, ...)
if type(var) == "function" then
return var(...)
else
return var
end
end
-- Возвращаем "под-функцию" для красоты.
return function(cases)
if cases[value] then -- Если есть готовый обработчик, не "хелпер" (называйте, как хотите), дергаем его.
return call_or_return(cases[value], value)
else -- Иначе дергаем все "хелперы"
for key, fun in pairs(cases) do
if type(key) == "function" and key(value) then
return call_or_return(fun, value)
end
end
end
-- Не один из возможных случаев не был вызван, так что если есть default-case, дергаем его.
local default = cases["default"]
if default then
return call_or_return(default)
end
end
end
Lua:
local function switch(value)
-- Утилита для вызова функции, или возврата значения, что функцией не является.
local function call_or_return(var, ...)
if type(var) == "function" then
return var(...)
else
return var
end
end
-- Возвращаем "под-функцию" для красоты.
return function(cases)
if cases[value] then -- Если есть готовый обработчик, не "хелпер" (называйте, как хотите), дергаем его.
return call_or_return(cases[value], value)
else -- Иначе дергаем все "хелперы"
for key, fun in pairs(cases) do
if type(key) == "function" and key(value) then
return call_or_return(fun, value)
end
end
end
-- Не один из возможных случаев не был вызван, так что если есть default-case, дергаем его.
local default = cases["default"]
if default then
return call_or_return(default)
end
end
end
local function typeof(_type)
return function(value)
return type(value) == _type
end
end
local function range(min, max)
return function(value)
return (type(value) == "number") and (value >= min) and (value <= max)
end
end
local function search_for(list, key)
return function(value)
return value == list[key]
end
end
local function any_of(...)
local list = {...}
return function(value)
for key, variant in pairs(list) do
if variant == value then
return true
end
end
return false
end
end
-- Думаю, и так ясно, что можно дописать свои хелперы и в йух не дуть.
print(switch("wtf") {
[1] = 1, -- Если нужно вернуть nil, стоит написать именно функцию, иначе switch не воспримет это как возвращаемое значение.
[2] = function() -- Простой обработчик, в случае передачи 2.
print(2)
end,
[range(4, 10)] = function(val) -- "Умный"-кейс, так скажем, все значения от 4 до 10 попадут сюда.
-- val передается для случаев, когда в switch вы сразу будете передавать результат другой функции...
-- т.е switch(some_fun(...)) { ... }
print(val, "ranged")
end,
[search_for({bebra = 228}, "bebra")] = function() -- Поиск значения в таблице по определенному ключу. Если будет передано 228, выведется "beeebra"
print("beeebra")
end,
[any_of("test", "baby", "wtf")] = function(val)
print("any_of", val)
end,
-- Стоит учитывать, что всегда будет вызываться только 1 обработчик и он рандомный (из-за особенности функции pairs)
-- Так что в этом примере, у вас может вызваться или этот или верхний обработчик
[typeof("string")] = function() -- Любая переданная строка вызовет этот кейс
print("THIS IS A STRING, YEAH BABY")
end,
["default"] = function() -- Если ни один из обработчиков не будет вызван, выведется "NO CASES"
print("NO CASES")
end
})