本模块为音MAD中文维基专门设计的工具类模块,且为元模块,请勿在模板中使用。
目前一共有以下方法,更多方法正在开发:
- isInArray
- 用于判断元素是否在数组 table 中,若存在则返回 true,用法:
isInArray(value, table)
- isInDict
- 用于判断元素是否在键值对 table,只要是键或者值都会返回 true,用法
isInDict(value, table)
- switch
- 与其它语言 switch 语句类似的方法。
- eval
- 如你所见,基于loadString实现的eval函数,用于执行字符串表达式。
local Utils = {}
-- head(table)
-- e.g: head({1,2,3}) -> 1
function Utils.head(tbl)
return tbl[1]
end
-- tail(table)
-- e.g: tail({1,2,3}) -> {2,3}
function Utils.tail(tbl)
if #tbl < 1 then
return nil
else
local newtbl = {}
for i = 2, #tbl do
newtbl[#newtbl + 1] = tbl[i]
end
return newtbl
end
end
-- foldr(function, default_value, table)
-- e.g: foldr(operator.mul, 1, {1,2,3,4,5}) -> 120
function Utils.foldr(func, val, tbl)
for _, v in pairs(tbl) do
val = func(val, v)
end
return val
end
Utils.first = Utils.head
function Utils.last(tbl)
return tbl[#tbl]
end
-- reduce(function, table)
-- e.g: reduce(operator.add, {1,2,3,4}) -> 10
function Utils.reduce(func, tbl)
return Utils.foldr(func, Utils.head(tbl), Utils.tail(tbl))
end
-- filter(function, table)
-- e.g: filter(is_even, {1,2,3,4}) -> {2,4}
function Utils.filter(func, tbl)
local newtbl = {}
for i, v in pairs(tbl) do
if func(v) then
newtbl[i] = v
end
end
return newtbl
end
-- map(function, table)
-- e.g: map(double, {1,2,3}) -> {2,4,6}
function Utils.map(func, tbl)
local newtbl = {}
for i, v in pairs(tbl) do
newtbl[i] = func(v)
end
return newtbl
end
function Utils.isInArray(val, t)
for _, v in ipairs(t) do
if v == val then
return true
end
end
return false
end
function Utils.keyOf(key, tbl)
if tbl[key] == nil then
return false
end
return true
end
function Utils.switch(t)
t.case = function(self, x)
local f = self[x] or self.default
if type(f) == "function" then
f(x, self)
else
return f
end
end
return t
end
return Utils