LUA接口扩展
这是并非石器的LUA的接口扩展,而是LUA默认的一些接口进行加强和扩展。可写在LUA脚本内,提供给其他LUA脚本调用。
-- table扩展
-- 返回table大小
table.size = function(t)
local count = 0
for _ in pairs(t) do
count = count + 1
end
return count
end
-- 判断table是否为空
table.empty = function(t)
return not next(t)
end
-- 返回table索引列表
table.indices = function(t)
local result = {}
for k, v in pairs(t) do
table.insert(result, k)
end
return result
end
-- 返回table值列表
table.values = function(t)
local result = {}
for k, v in pairs(t) do
table.insert(result, v)
end
return result
end
table.valuestring = function( t, delim )
local result
for _, v in pairs(t) do
if not result then
result = v
else
result = result .. delim .. v
end
end
return result
end
-- 浅拷贝
table.clone = function(t, nometa)
local result = {}
if not nometa then
setmetatable(result, getmetatable(t))
end
for k, v in pairs (t) do
result[k] = v
end
return result
end
-- 深拷贝
table.copy = function(t, nometa)
local result = {}
if not nometa then
setmetatable(result, getmetatable(t))
end
for k, v in pairs(t) do
if type(v) == "table" then
result[k] = table.copy(v)
else
result[k] = v
end
end
return result
end
table.first = function ( t )
for k,v in pairs(t) do
return { key = k, value = v }
end
end
table.load = function(lua)
local t = type(lua)
if t == "nil" or lua == "" then
return nil
elseif t == "number" or t == "string" or t == "boolean" then
lua = tostring(lua)
else
error("can not unserialize a " .. t .. " type.")
end
lua = "return " .. lua
local func = load(lua)
if func == nil then
return nil
end
return func()
end
--print 拓展
do
local _print = print
print = function ( ... )
local info = debug.getinfo(2)
_print(info.short_src, info.currentline)
_print(...)
end
end
-- string扩展
do
local mt = getmetatable("")
-- 下标运算
local _index = mt.__index
mt.__index = function (s, ...)
local k = ...
if "number" == type(k) then
return _index.sub(s, k, k)
else
return _index[k]
end
end
--和 number 对比拓展
local _lt = mt.__lt
mt.__lt = function (a,b)
if type(a) == "string" and type(b) == "string" then
return _lt(a,b)
else
return tonumber(a) < tonumber(b)
end
end
local _le = mt.__le
mt.__le = function (a,b)
if type(a) == "string" and type(b) == "string" then
return _le(a,b)
else
return tonumber(a) <= tonumber(b)
end
end
end
local function Split(s, delim)
local nFindStartIndex = 1
local nSplitIndex = 1
local nSplitArray = {}
while true do
local nFindLastIndex = string.find(s, delim, nFindStartIndex)
if not nFindLastIndex then
nSplitArray[nSplitIndex] = string.sub(s, nFindStartIndex, string.len(s))
break
end
nSplitArray[nSplitIndex] = string.sub(s, nFindStartIndex, nFindLastIndex - 1)
nFindStartIndex = nFindLastIndex + string.len(delim)
nSplitIndex = nSplitIndex + 1
end
return nSplitArray
end
string.split = function(s, delim, number)
local split = {}
if delim:len() == 1 then
local pattern = "[^" .. delim .. "]+"
string.gsub(s, pattern, function(v)
if number then
v = tonumber(v) or v
end
table.insert(split, v)
end
)
else
split = Split(s, delim)
end
return split
end
string.ltrim = function(s, pattern)
pattern = pattern or "%s"
return (string.gsub(s, "^" .. pattern .. "+", ""))
end
string.rtrim = function(s, pattern)
pattern = pattern or "%s"
return (string.gsub(s, pattern .. "+" .. "$", ""))
end
string.trim = function(s, pattern)
return string.rtrim(string.ltrim(s, pattern), pattern)
end
string.repeated = function( delim, num, value )
local ret
for i=1,num do
if not ret then
ret = value
else
ret = ret .. delim .. value
end
end
return ret
end
local function dump(obj)
local getIndent, quoteStr, wrapKey, wrapVal, dumpObj
getIndent = function(level)
return string.rep("\t", level)
end
quoteStr = function(str)
return '"' .. string.gsub(str, '"', '\\"') .. '"'
end
wrapKey = function(val)
if type(val) == "number" then
return "[" .. val .. "]"
elseif type(val) == "string" then
return "[" .. quoteStr(val) .. "]"
else
return "[" .. tostring(val) .. "]"
end
end
wrapVal = function(val, level)
if type(val) == "table" then
return dumpObj(val, level)
elseif type(val) == "number" then
return val
elseif type(val) == "string" then
return quoteStr(val)
else
return tostring(val)
end
end
dumpObj = function(obj, level)
if type(obj) ~= "table" then
return wrapVal(obj)
end
level = level + 1
local tokens = {}
tokens[#tokens + 1] = "{"
for k, v in pairs(obj) do
tokens[#tokens + 1] = getIndent(level) .. wrapKey(k) .. " = " .. wrapVal(v, level) .. ","
end
tokens[#tokens + 1] = getIndent(level - 1) .. "}"
return table.concat(tokens, "\n")
end
return dumpObj(obj, 0)
end
do
local _tostring = tostring
tostring =function(v)
if type(v) == 'table' then
return dump(v)
else
return _tostring(v)
end
end
end
-- math扩展
do
local _floor = math.floor
math.floor = function(n, p)
if p and p ~= 0 then
local e = 10 ^ p
return _floor(n * e) / e
else
return _floor(n)
end
end
end
math.round = function(n, p)
local e = 10 ^ (p or 0)
return math.floor(n * e + 0.5) / e
end
-- lua面向对象扩展
local _class={}
function class(super)
local class_type={}
class_type.ctor=false
class_type.super=super
class_type.new=function(...)
local obj={}
do
local create
create = function(c,...)
if c.super then
create(c.super,...)
end
if c.ctor then
c.ctor(obj,...)
end
end
create(class_type,...)
end
setmetatable(obj,{ __index=_class[class_type] })
return obj
end
local vtbl={}
_class[class_type]=vtbl
setmetatable(class_type,{__newindex=
function(t,k,v)
vtbl[k]=v
end
})
if super then
setmetatable(vtbl,{__index=
function(t,k)
local ret=_class[super][k]
vtbl[k]=ret
return ret
end
})
end
return class_type
end

