一些极其有用的Lua代码

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





猜你喜欢

转载自blog.csdn.net/lsldd/article/details/47905509