下面是一些常用的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