关于cocos2dx lua中的clone函数的源码解读

cocos2dx的clone函数,是深拷贝,完全的拷贝,这段代码内容不多,不过第一次看还是有点晕,我把解读记下来分享一下.

源码解读:

function clone(object)--clone函数
    local lookup_table = {}--新建table用于记录
    local function _copy(object)--_copy(object)函数用于实现复制
        if type(object) ~= "table" then
            return object   ---如果内容不是table 直接返回object(例如如果是数字\字符串直接返回该数字\该字符串)
        elseif lookup_table[object] then
            return lookup_table[object]--这里是用于递归滴时候的,如果这个table已经复制过了,就直接返回
        end
        local new_table = {}
        lookup_table[object] = new_table--新建new_table记录需要复制的二级子表,并放到lookup_table[object]中.
        for key, value in pairs(object) do
            new_table[_copy(key)] = _copy(value)--遍历object和递归_copy(value)把每一个表中的数据都复制出来
        end
        return setmetatable(new_table, getmetatable(object))--每一次完成遍历后,就对指定table设置metatable键值
    end
    return _copy(object)--返回clone出来的object表指针/地址
end 

实例示范:

function clone(object)
    local lookup_table = {}
    local function _copy(object)
        if type(object) ~= "table" then
            return object
        elseif lookup_table[object] then
            return lookup_table[object]
        end
        local new_table = {}
        lookup_table[object] = new_table
        for key, value in pairs(object) do
            new_table[_copy(key)] = _copy(value)
            print(key,value)--这句添加print函数 演示输出复制的过程
        end
        return setmetatable(new_table, getmetatable(object))
    end
    return _copy(object)--返回clone出来的object表指针/地址
end 

local a = {
[{100, 200}] = { 300, 400}, 200, { 300, 500},
abc = "abc"}

local myPolygon = {
color="blue",
thickness=2,
npoints=4,
{x=0, y=0},
{x=-10, y=0},
{x=-5, y=4},
{x=0, y=4}
}

local newtable = clone(a)
local newtable2 = clone(myPolygon)

-----------输出内容

1
200

1 300

2 500

2 table: 0x7ffa43d06930

1 100

2 200

1 300

2 400

table: 0x7ffa43d06610 table: 0x7ffa43d068f0

abc abc          ---以上是复制表a时的输出内容  后面以下是表myPolygon的输出内容

x 0

y 0

1 table: 0x7ffa43d064f0

x -10

y 0

2 table: 0x7ffa43d06a60

x -5

y 4

3 table: 0x7ffa43d06af0

x 0

y 4

4 table: 0x7ffa43d06b80

npoints 4

thickness 2

color blue

时间: 2024-11-05 18:32:07

关于cocos2dx lua中的clone函数的源码解读的相关文章

Spark-1.6.0中的Sort Based Shuffle源码解读

从Spark-1.2.0开始,Spark的Shuffle由Hash Based Shuffle升级成了Sort Based Shuffle.即Spark.shuffle.manager从Hash换成了Sort.不同形式是Shuffle逻辑主要是ShuffleManager的实现类不同. 在org.apache.spark.SparkEnv类中: // Let the user specify short names for shuffle managers val shortShuffleMgr

Cocos2d-x Lua中使用标签

游戏场景中的文字包括了静态文字和动态文字.静态文字如下图所示游戏场景中①号文字“COCOS2DX”,动态文字如图4-1所示游戏场景中的②号文字“Hello World”.静态文字一般是由美工使用Photoshop绘制在背景图片上,这种方式的优点是表现力很丰富,例如:①号文字“COCOS2DX”中的“COCOS”.“2D”和“X”设计的风格不同,而动态文字则不能,而且静态文字无法通过程序访问,无法动态修改内容.动态文字一般是需要通过程序访问,需要动态修改内容.Cocos2d-x Lua可以通过标签

Cocos2d-x Lua中实例:特效演示

Cocos2d-x Lua中实例:特效演示 下面我们通过一个实例介绍几个特效的使用,这个实例如下图所示,上图是一个操作菜单场景,选择菜单可以进入到下图动作场景,在下图动作场景中点击Go按钮可以执行我们选择的特性动作,点击Back按钮可以返回到菜单场景. 特效实例 我们重点看看MyActionScene场景,MyActionScene.lua主要代码如下: [html] view plaincopy … … local sprite                                 

Cocos2d-x Lua中Sprite精灵类

Cocos2d-x Lua中Sprite精灵类 精灵类是Sprite,它的类图如下图所示. Sprite类图 Sprite类直接继承了Node类,具有Node基本特征.此外,我们还可以看到Sprite类的子类有:PhysicsSprite和Skin.PhysicsSprite是物理引擎精灵类,Skin是皮肤精灵类用于骨骼动画.创建Sprite精灵对象创建精灵对象有多种方式,其中常用的函数如下:cc.Sprite:create ().创建一个精灵对象,纹理[ 纹理(texture),表示物体表面细

Lua中调用C函数

Lua利用一个虚拟的堆栈来给C传递值或从C获取值.每当Lua调用C函数,都会获得一个新的堆栈,该堆栈初始包含所有的调用C函数所需要的参数值(Lua传给C函数的调用实参),并且C函数执行完毕后,会把返回值压入这个栈(Lua从中拿到C函数调用结果). 于此相关的C API有几个比较重要的定义如下: (1)typedef struct lua_State lua_State; lua虚拟机(或叫解释器),可以理解为一个thread,和一个完整的Lua虚拟环境的执行状态. (2)typedef int

Lua中调用C函数(lua-5.2.3)

Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性. 对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数. 对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L). 简单说明一下,该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数,实现者可以通过该指针进一步获取Lua代码中实际传入的参数.返回值是整型,表示该

Cocos2d-x Lua中帧动画

Cocos2d-x Lua中帧动画 帧动画就是按一定时间间隔.一定的顺序.一帧一帧地显示帧图片.我们的美工要为精灵的运动绘制每一帧图片,因此帧动画会由很多帧组成,按照一定的顺序切换这些图片就可以了. 在Cocos2d-x Lua中播放帧动画涉及到两个类:Animation和Animate,类图如图所示,Animation是动画类,它保存有很多动画帧,Animate类是动作类它继承于ActionInterval类,属于间隔动作类,它的作用是将Animation定义的动画转换成为动作进行执行,这样我

Cocos2d-x Lua中网格动作

Cocos2d-x Lua中网格动作 GridAction它有两个主要的子类Grid3DAction和TiledGrid3DAction,TiledGrid3DAction系列的子类中会有瓦片效果,如下图所示是Waves3D特效(Grid3DAction子类),如后图所示是WavesTiles3D特效(TiledGrid3DAction子类),比较这两个效果我们会看到瓦片效果的特别之处是界面被分割成多个方格. Waves3D特效 WavesTiles3D特效 网格动作都是采用3D效果给用户的体验

cocos2d-x lua 中使用protobuf并对http进行处理

本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok) 本博客链接 http://blog.csdn.net/vpingchangxin/article/details/24458051 protobuf  Google的一个非常好用的数据传输的封装 说实话Google的东西确实比較好用 所以我们前后端数据交换就用他了 只是Google没有对lua进行支持 还好社区有开源的大侠们贡献 找了全部关于lua protobuf 我仅仅找到