打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

Module:Utils

来自音MAD维基

本模块为音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