下面是一些常用的Lua代码,如面向对象支持等。整理了一些,在项目中得到较好的应用。
后续有机会持续更新。
1、字符串输出数据。
能够比较美观的输出Table。可能不够完美,但还是比较好用。
-- level用于内部递归用,使用时不用传入
function VarToString(var, level)
local SPLIT_CHAR = '\n';
local SPLIT_CHAR_WIN = '\r\n';
local SPLIT_TABLE = ' ';
local szRet = "";
if(level==nil) then level = 0; end;
local function Tabs(n)
local szTabs = '';
for i = 0,n do szTabs = szTabs .. SPLIT_TABLE; end
return szTabs;
end
local szType = type(var);
if szType == "number" then
szRet = szRet .. var;
elseif szType == "boolean" then
szRet = szRet .. tostring(var);
elseif szType == "string" then
szRet = szRet .. string.format("%q", var);
elseif szType == "table" then
szRet = szRet .. "{" .. SPLIT_CHAR_WIN;
for k, v in pairs(var) do
local szKey = VarToString(k);
local szVal = VarToString(v);
if (szKey and szVal) then
szRet = szRet .. Tabs(level) .. "[" .. VarToString(k) .. "]=" .. VarToString(v, level+1) .. ',' .. SPLIT_CHAR_WIN;
end
end
local metatable = getmetatable(var);
if metatable ~= nil and type(metatable.__index) == "table" then
for k, v in pairs(metatable.__index) do
local szKey = VarToString(k);
local szVal = VarToString(v);
if (szKey and szVal) then
szRet = szRet .. Tabs(level) .. "[" .. VarToString(k) .. "]=" .. VarToString(v, level+1) .. "," .. SPLIT_CHAR_WIN;
end
end
end
szRet = szRet .. Tabs(level-1) .. "}";
elseif szType == "function" then
szRet = szRet .. tostring(var);
elseif szType == "nil" then
return nil;
end
return szRet;
end
2、基础的面向对象支持方法。
这个比《Programming in Lua》里的方法更加完善。来自云风 http://blog.codingnow.com/cloud/LuaOO。
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
3、对象拷贝(深拷贝)方法。
代码来自cocos2dx。
function clone(object)
--新建table用于记录
local lookup_table = {}
--_copy(object)函数用于实现复制
local function _copy(object)
if type(object) ~= "table" then
return object ---如果内容不是table 直接返回object(例如如果是数字\字符串直接返回该数字\该字符串)
elseif lookup_table[object] then
return lookup_table[object]--这里是用于递归滴时候的,如果这个table已经复制过了,就直接返回
end
--新建new_table记录需要复制的二级子表,并放到lookup_table[object]中.
local new_table = {}
lookup_table[object] = new_table
--遍历object和递归_copy(value)把每一个表中的数据都复制出来
for key, value in pairs(object) do
new_table[_copy(key)] = _copy(value)
end
--每一次完成遍历后,就对指定table设置metatable键值
return setmetatable(new_table, getmetatable(object))
end
--返回clone出来的object表指针/地址
return _copy(object)
end