--   -- run 

  --   local sceneGame = cc.Scene:create() 

  --   sceneGame:addChild(createLayerFarm()) 

  --   sceneGame:addChild(createLayerMenu()) 

 

--if cc.Director:getInstance():getRunningScene() then 

-- 
 cc.Director:getInstance():replaceScene(sceneGame) 

--else 

-- 
 cc.Director:getInstance():runWithScene(sceneGame) 

--end 

    cclog("----------------------------------------") 



   --local nhang = 1 / 3 

   --local nNumber = (1 % 3) * 200 

   --local X = nNumber 

   --local Y = nhang * 100 

      --   nhang = nhang - nhang%1 

      --   print("ddddddd") 

      --   local a, b = math.modf(1/10) 

      --   print(a) 

      --   print(b) 

      --   Map = {1,2,3} 



      --   for id, name in next, Map do 

      --      print(id, name)               -- 返回的时候用括号括起来表示返回的参数 

      --   end  



      --local uiLayout = GUIReader:shareReader():widgetFromJsonFile("DemoLogin/DemoLogin.ExportJson") 



      --local a = 1 

      --assert( a == 2 , "dugaoda assert") 

      --cclog("next") 

      --local t = next(tMy) 

      --cclog("next%d", t) 

      --cclog("unpack") 

       

      --cclog("unpack") 

      ---- 闭包的概念 

      local __index123 = function () return 1  end 

      local value = __index123()  -- value 1 

      local __index1 = function (a) return (1 + a)  end 

      local value1 = __index1(2)  -- value1  3 

      local pointer = __index123  -- 指向__index123这个函数 

      cclog("pointer()") 

      print(pointer()) 

      --print(pointer(2)) 

      pointer = __index1 

      cclog("pointer(2)") 

      print(pointer(2)) 



      --local temptable = {"du", "gao", "da"} 

      --table.concat(temptable, ";", 1, 2)  -- du:gao 

      --local table2 = {[1] = "a", [2] = "b", [3] = "c", [26] = "z"} 

      --table.maxn(table2)  -- 会返回26 



      --local meta =  

      --{ 

      --  __add = function (op1, op2) 

      --       op ={} 

      --       op.x = op1.x + op2.x 

      --       op.y = op1.y + op2.y 

      --       return op 

      --       end 

      --} 

      ---- meta 变化的意思 

      --local a = { x = 1, y = 2 } 

      --setmetatable(a, meta) 

      --local b = { x = 2, y = 3} 

      --c = a + b 

      --print("add realize") 

      --print(c.x, c.y)  -- 输出3 5 





 -------------------------- 2015年1月22日 -------------------------- 



      -- 使用cocos2d中extern中的class 

      local MySprite = class("MySprite",  

                      function(fileName) 

                         return CCSprite:create(fileName)  

                      end 

      ) 

       

      MySprite.__index = MySprite 

      MySprite.type1 = 0 



      function MySprite:createMS(fileName, _type) 

          local mySprite = MySprite.new(fileName) 

          mySprite:myInit(_type) 

          return mySprite 

      end 



      function MySprite:myInit(_type) 

          self.type1 = _type 

      end 



      local ddds = MySprite:createMS("menu2.png", 1) 

      ddds:setPosition(ccp(100, 100)) 

      --sceneGame:addChild(ddds, 100) 



      -- 创建layer 

      local DuGaoDaLayer = class("DuGaoDaLayer",  

                           function () 

                               return CCLayer:create() 

                           end                                   

      ) 

      DuGaoDaLayer.__index = DuGaoDaLayer  -- 其实这句貌似这里可以不用写 在创建的其实就已经给DuGaoDaLayer设置元表 

      DuGaoDaLayer.H = 10   -- 新增成员变量 

      DuGaoDaLayer.W = 20   -- 新增成员变量 



      -- 模仿他们的创建函数 实例对象 

      function DuGaoDaLayer:create() 

              local layer = DuGaoDaLayer.new() 

              --layer:setH(1) 

              return layer 

      end 



      -- 新增函数 

      function DuGaoDaLayer:setH(nHeight) 

         self.H = nHeight 

      end 



      -- 创建 

      local templayer = DuGaoDaLayer:create() 

      -- 以后函数的创建或调用统一使用:           只有成员变量调用的时候才使用.  自己在创建和调用的时候老是调用. 

      templayer:setH(1)  

      print("dugaodalayer") 

      print(templayer.H) 

      print(templayer.W) 







      Window = {} 

      Window.prototype = {x = 0, y = 0, width = 100, heiht = 100} 

      Window.mt = {} 

      --Window.td ={} 

      function Window.new(o) 

          setmetatable(o, Window.mt) 

          return o 

      end 

      Window.mt.__index = function(table, key)   -- 这里的元方法是函数 

          return Window.prototype[key] 

      end 



      local w = Window.new({x = 10, y = 20}) 

      print(w.width)   -- 100 



      -- 元表的使用 

      -- 定义一个表  

      ManDuGaoDa = {} 

      ManDuGaoDaSon = {} 

      ManDuGaoDaSon.info = {name = "duxiaoda", age = 10} 

      ManDuGaoDa.mt = {}  -- 创建元表 



      setmetatable(ManDuGaoDa, ManDuGaoDa.mt)   

      --ManDuGaoDa.mt.__index = function(table, Key)    -- 实现元表中的内容 

      --   return ManDuGaoDaSon.info[Key]  

      --end  

      --或写成   

      ManDuGaoDa.mt.__index = ManDuGaoDaSon.info  -- 在这里ManDuGaoDaSon.info称为元方法 

      print(ManDuGaoDa.name)  -- 输出 duxiaoda  

      print(ManDuGaoDa.age)   -- 输出 10 





      -- lua类的使用 

      -- 1.定义表 

      dugaoda = {garde = 0} 

      -- 2.模拟构造体 

      function dugaoda:new(o) 

          local o = o or {} 

          setmetatable(o, self) 

          self.__index = self 

          return o 

      end 

       

      function dugaoda:play() 

         print("dugaoda") 

      end 

      function dugaoda:test1() 

         print("test1") 

      end 

      function dugaoda:test2() 

         print("test2") 

      end 

      -- dugaoda的实例dugaoda1 

      dugaoda1 = dugaoda:new()   

      -- 重新定义基类的方法play 

      function dugaoda1:play() 

         print("dugaoda1") 

      end 

      -- dugaoda1的实例dugaoda2 

      dugaoda2 = dugaoda1:new()   -- 这里把dugaoda1当作dugaoda的子类使用 

      print(dugaoda2.garde)       -- 输出 0 

      dugaoda2.garde = 10 

      print(dugaoda2.garde)       -- 输出 10 

      --print(dugaoda2.garde())   -- 错误 这是成员不是方法 

      dugaoda2:play()             -- 输出 dugaoda1 

      dugaoda2:test1()            -- 输出 test1 

      dugaoda2:test2()            -- 输出 test2 





      -- 另一种方式类,带有成员方法的并且初始化成员方法 

      dugaodafamily = {nfather = 0, nmother = 0, nson = 0, nwife = 0} 

      dugaodafamily.__index = dugaodafamily 



      function dugaodafamily:new(father, mother, son, wife) 

          local self = {} 

          setmetatable(self, dugaodafamily)  -- 设置 元方法是dugaodafamily,dugaodafamily是table也可以是函数 

          self.nfather = father 

          self.nmother = mother 

          self.nson = son 

          self.nwife = wife 

          return self 

      end 



      clonedugaoda = dugaodafamily:new(1, 2, 3, 4) 

      print(clonedugaoda.nfather) 

      print(clonedugaoda.nmother) 

      print(clonedugaoda.nson) 

      print(clonedugaoda.nwife) 



      print("------------------- coroutine -----------------------------") 

      -- 协同程序 

      local co = coroutine.create(function () print("coroutine running") end) --创建新的协同程序 

      print(coroutine.status(co)) -- 输出co的状态  现在是suspended 

      coroutine.resume(co)       -- coroutine running 

      -- coroutine.yield() 



      local cotest = coroutine.create(function () 

            for i = 1, 10 do 

                print("co", i) 

                coroutine.yield() 

            end 

      end) 



      coroutine.status(cotest)  -- 查看 

      coroutine.resume(cotest)  -- 唤起  

      coroutine.status(cotest)  -- 查看 

      coroutine.resume(cotest)  -- 再次唤起 



     coroutine.resume(cotest)     -- 打印co 3 

     coroutine.resume(cotest)     -- 打印co 4 

     coroutine.resume(cotest)     -- 打印co 5 

     coroutine.resume(cotest)     -- 打印co 6 

     coroutine.resume(cotest)     -- 打印co 7 

     coroutine.resume(cotest)     -- 打印co 8 

     coroutine.resume(cotest)     -- 打印co 9 

     coroutine.resume(cotest)     -- 打印co 10 

     coroutine.resume(cotest)     -- 什么都不打印 

     print(coroutine.status(cotest))     -- dead 



     local co1 = coroutine.create(function () 

         for i = 1, 5 do 

             print("dugaoda hp:", i) 

             coroutine.yield(co1) 

         end 

         print("stop hp +") 

     end) 

     coroutine.resume(co1)   -- 1 

     coroutine.status(co1) 



     coroutine.resume(co1)   -- 2 

     coroutine.status(co1) 



     coroutine.resume(co1)   -- 3 

     coroutine.status(co1) 



     coroutine.resume(co1)   -- 4 

     coroutine.status(co1) 



     coroutine.resume(co1)   -- 5 

     coroutine.status(co1) 



     coroutine.resume(co1)  -- 已经死亡无法唤起 

     print(coroutine.status(co1))  -- dead 





     local co2 = coroutine.create(function (name) 

         print(name) 

         for i = 1, 10 do 

             coroutine.yield("dugaoda give") 

         end 

     end) 



     local result, msg = coroutine.resume(co2, "du")  -- 其实这边得到的是 coroutine.yield("dugaoda give")返回的结果和信息 

     print(msg) 

     local result, msg = coroutine.resume(co2) 

     print(msg) 

     local result, msg = coroutine.resume(co2) 

     print(msg) 



     function foo (a) 

         print("foo", a)  -- foo 2 

         return coroutine.yield(2 * a) -- return 2 * a 

     end 

   

     co = coroutine.create(function (a , b) 

         print("co-body", a, b) -- co-body 1 10 

         local r = foo(a + 1) 

   

         print("co-body2", r) 

         local r, s = coroutine.yield(a + b, a - b) 

   

         print("co-body3", r, s) 

         return b, "end" 

     end) 

   

     print("main", coroutine.resume(co, 1, 10)) -- true, 4 

     print("------") 

     print("main", coroutine.resume(co, "r")) -- true 11 -9 

     print("------") 

     print("main", coroutine.resume(co, "x", "y")) -- true 10 end 

     print("------") 

     print("main", coroutine.resume(co, "x", "y")) -- false cannot resume dead coroutine 

     print("------") 

      

     --     -- 基类 

     --Account = {balance = 0} 



     --function Account.new(o) 

  -- o = o or {} 

  -- setmetable(o, self) 

  -- self.__index = self 

  -- return o 

     --end 



     --function Account:desposit(v) 

     --     self.balance = self.balance + v 

     --end 



     ---- 子类 

     --SpeciallAccount = Account:new() 



     ---- 实例子类对象 

     --a = SepciallAccount:new(1000.00) 



     --Person = { name = "这个人很懒" } 

     --Person.talk = function ( self , words ) 

     --print ( self.name .. "说:" .. words ) 

     --end 

     --Person:talk("你好") 



      --    local meta =  

      --{ 

      --  talek = function () 

      --       return print("a") 

      --       end 

      --} 

      ---- meta 变化的意思 

      --local a = {} 

      --setmetatable(a, meta) 

      --a.talek() 



      --local MyLayer = class("MyLayer", function() 

      --return CCLayer:create() 

      --end) 

 -------------------------- 2015年1月22日 -------------------------- 

 -- 错误处理,程序终止,不会执行下去,会输出如下提示 



 -- error 

     --error("你的智商不多了,赶紧休息,恢复一下吧") 

 -- 如果assert的第一个参数为不为false,则返回第一个参数的值;否则,执行error函数,输出错误信息,错误信息的内容为assert的第二个参数。 

     --assert(false, "你是一个非常善良有爱心的人,我很喜欢你..所以,去死吧!") 

 -- 使用pcall调用test函数,如果test不报错,则pcall返回ture,否则,返回false。 

    function test() 

        print("dugaoda true") 

    end 

    if pcall(test) then 

        print("normal") 

    else 

        print("error") 

    end 





    -- 函数的几个特别之处  函数参数个数自适应 

    function dugaodamethod(sNmae, nAge) 

        print(sNmae) 

        print(nAge) 

    end 



    dugaodamethod("dugaoda") 

    dugaodamethod("dugdaoda", 40, 20, "hello") 



    function dugaodareturn() 

        return 10, 20 

    end 

    local a, b, c = 10, dugaodareturn() -- 输出 10 10 20 

    -- 函数的特点之一:如果函数的调用不是在表达式的最后一个元素,则最多只返回一个值 

    local a, b, c = dugaodareturn(), 10 -- 输出 10 10 nil 

    print(a) 

    print(b) 

    print(c) 

    -- 具名实参 

    function dugaodainfo1(args) 

        return args.name, args,age 

    end 

    -- 是根据table的key值来获取的,根本就不需要考虑参数顺序 

    local sname, nage = dugaodainfo1({name = "dugaoda", age = 30}) 





 -- 非局部变量 

     function myclosure() 

        local i = 0     -- 在这里i属于非局部变量 

        return function () 

               i = i + 1 

               return i 

               end  

     end 

     local mydiaoyong = myclosure()   -- myclosure()函数的返回值是一个匿名函数,这里要特别的注意mydiaoyong对应的值是myclosure()的返回值匿名函数 

     -- 相当于 mydiaoyong = function () i = i + 1 return i end  

     -- 当执行 local mydiaoyong = myclosure() 的时候其实运行了myclosure()函数里面的内容对i赋了初0 

     -- 执行mydiaoyong()的时候其实相当于执行匿名函数里面的内容 返回得到i的内容 

     print(mydiaoyong()) -- 1 

     print(mydiaoyong()) -- 2 

     print(mydiaoyong()) -- 3 



     --在这里,local i就属于一个非局部变量,因为它既不是全局变量,也不是单纯的局部变量(因为另外一个函数可以访问到它)。 

     --再来回到定义,count函数里的那个函数,加上非局部变量i,就构成了一个闭合函数了,就这么简单。 

     --对于闭合函数而言,属于它的非局部变量,并不是在调用它的时候临时产生的,而是和它一起存在的。 

     --所以每次调用闭合函数,非局部变量的值都不会被重置。 



    function myclosure1() 

        return function () 

               local ni = 123     -- 在这里ni属于局部变量 

               ni = ni + 1 

               return ni 

               end  

    end 



    local temp = myclosure1() 

    print(temp())   -- 输出123 

    print(temp())   -- 输出123 

    print(temp())   -- 输出123 



    -- 介绍一个“语法糖” 

    function dugaodayufa() 

    end 

    -- 等价于  上下两个等价 

    local dugaodayufa 

    dugaodayufa = function() 

    end 



    -- 这样就不会报错了 du1能够识别到du2 

    local du1 

    local du2 

    local function du1() 

        return du2() 

    end 

    local function du2() 

        print("23") 

    end 



    -- 尾调用 

    -- 尾调用的大致意思是:一个函数的调用是另一个函数的最后一个动作时,这个调用就称之为尾调用。 

    function foo1() 

        return foo() 

    end 



    --这就不属于尾调用,因为调用完count函数之后,还要取得count的返回值,然后进行一次加法操作 

    function foo2() 

        return foo() + 1 

    end 



     function foo234(n) 

         if n > 0 then 

             return foo234(n - 1) 

         else 

             return "dugaoda" 

         end 

     end 

     local p = foo234(5) 

     print(p) 



     --  迭代器 打算2015年1月23日 看一遍   

     local tabTest = {du, gao, da, ha, ha, ha} 

     for index, value in ipairs(tabTest) do 

         print(value) 

     end 



     function mydiedaiqi(t) 

         local i = 0 

         return function() 

             i = i + 1 

             return t[i] 

         end 

     end 



     local iter = mydiedaiqi(tabTest) 

     -- 实现1 

     while true do 

         local value = iter() 

         if value == nil then 

             break 

         end 

         print(value) 

     end 

     -- 实现2 

     for value in mydiedaiqi(tabTest) do 

         print(value) 

     end 





     function a(...) 

         local arg = {...} 

     end 



     -- 字符串部分 



     -- require (用于使用模块) 

     -- module (用于创建模块) 

     print("require dugaoda") 

     --require("src/dugaoda") 

     require("src/dugaoda")  -- 

     -- 都可以正常的调用dugaoda.lua 中的MAX_DUGAODA_SIZE和hesls()变量和函数 ,如果dugaoda.lua中的变量或方法有关键字local那么就会调用不到 

     print(MAX_DUGAODA_SIZE) 

     hesls() 

     -- 包含模块文件 

     local dugaodason1 = require("dugaodason") 

     dugaodason1.info() 



     --pay() 

     -- 其实,require干的事就是这样:(这就是为什么模块文件要写成那样了) 

     --local dugaodason1 = (function() 

     ---- dugaodason.lua的内容 

     --end) 



 -------------- 模块(module)和包(package) -------------- 



     -- require会将返回值存储到table package.loaded中 



     require("dugaodabigson") 

     --pay() -- 错误  程序识别不到pay这个函数必须加上前缀dugaodabigson 

     dugaodabigson.pay() -- 正确 





     --简单的说 

     --a.lua 

     --module (..., package.seeall) 

     --flag=true 

     --function example() 

     --... 

     --end 

     --在别的脚本中 

     --require "a" 



     --调用脚本a中的任何全局变量或者函数必须加上a. 

     --这个好处就是你不同的脚本中可以用相同的名称定义变量或者函数,而不会混乱。 

 -------------- 模块(module)和包(package) -------------- 



     -- Lua中的捕获机制和转换技巧介绍 

     local getstr = "dugaoda = memeda" 

     local _, _, key, vale = string.find(getstr, "(%a+)%s*=%s*(%a+)") 

     -- 存储哑元变量 _ 中 

     -- '%a+' 表示非空的字母序列;'%s*' 表示0个或多个空白  %[对应符号[  %]对应符号%] 貌似也可以用\[ \] 

     local date = "17/7/1990" 

     local month, day, year = string.find(date, "(%d+)/(%d+)/(%d+)") 

     -- 假定你想查找一个字符串中单引号或者双引号引起来的子串,你可能使用模式 '["'].-["']', 

     local s = [[then he said: "it's all right"!]] 





     -- Lua中handler方法的原理详解 

     print("-------------- handler --------------") 

     local dugaodahandler = {} 

     function dugaodahandler:fun() 

         self.m = "hello"   

     end 

     local dugaodahandler1 = {} 

     dugaodahandler.fun(dugaodahandler1)  -- 因为fun函数里面执行的内容是 dugaodahandler1.m = "hello"  替代了self 

      

     print(dugaodahandler1.m)  -- hello 

     print(dugaodahandler.m)   -- nil 

     --handler(cls, cls.onClose) 



     function fandlertemp(obj, method) 

         return function(...) 

             return method(obj, ...) 

         end 

     end 



     local cls = {} 

     cls._m = "close" 

     function cls:onClose() 

         print(self._m) 

     end 

       

     fandlertemp(cls, cls.onClose)()   -- 分析 

     --local sdie = fandlertemp(cls, cls.onClose)  -- 结果sdie = function(...) return method(obj, ...) end 

     --sdie()  -- 执行 method(obj, ...) 函数   cls:onClose() print(cls._m) 

      

     --+      匹配前一字符1次或多次 

     --*      匹配前一字符0次或多次 

     ---      匹配前一字符0次或多次 

     --?      匹配前一字符0次或1次 



     -- 另外的2中循环 

     local conditon = 5 

     while conditon == 5 do 

         print("de") 

         conditon = 1 

     end 



     repeat 

         print("de") 

         conditon = 5 

     until conditon == 5 





     local di = {2,2,3} 

     local sd = next(di)  -- 返回第一个索引的值 可以用next(t)来检测表是否为空(此函数只能用于以数字索引的表与ipairs相类似) 

     print(sd)  -- 输出1 

     local myceil = math.ceil(3.1) 

     print(myceil)  -- 输出4 



     --randomseed 
 --设随机数种子 
 math.randomseed(os.time()) 
   

     --random 
 --取随机数 
 math.random(5,90) 
 5~90 

     --modf 
 取整数和小数部分 
 math.modf(20.12) 
 20   0.12 

     --mod 
 取模 
  math.mod(65535, 2) 
 1 

     local str1 = string.char(97) -- 转换整数为相对应的字符 

     print(str1) 

     -- 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 





     base_type = class()  -- 定义一个基类 base_type 



     function base_type:ctor(a)  -- 定义 base_type 的构造函数 

         print("base_type ctor") 

         self.m_a = a 

     end 



     function base_type:print_a()  -- 定义一个成员函数 

         print(self.m_a) 

     end 



     function base_type:hello()  -- 定义另一个成员函数 base_type:hello 

         print("hello base_type") 

     end 

      



     jichenglei = class(base_type) -- 定义一个类 jichenglei 继承于 basetype 



     function jichenglei:ctor()    -- 定义 jichenglei 的构造函数 

         print("jichenglei ctor") 

     end 



     function jichenglei:hello()   -- 重载 base_type:hello 为 jichenglei:hello 

         print("hello jichenglei") 

     end 



     myjicheng = jichenglei.new(2) 

     myjicheng:print_a() 

     print("class") 







     --Lua教程之弱引用table 

     --1.无法超越人类智慧的智能——自动内存管理的缺陷 

     t = {} 



     key1 = {name = "du"} 

     t[key1] = 1 

     key1 = nil 



     key2 = {name = "gao"} 

     t[key2] = 2 

     key2 = nil 



     -- 强制进行一次垃圾收集 

     --collectgarbage();  -- 单词barbage垃圾的意思 



     for Key, Value in pairs(t) do 

         print(Key.name .. ": " .. Value) 

     end 



     --2.颠覆你的认知——弱引用table 

     --刚刚举例的只是正常情况,那么,如果我们把某个table作为另一个table的key值后,希望当table设为nil值时,另一个table的那一条字段也被删除。 

     --应该如何实现? 

     --这时候就要用到弱引用table了,弱引用table的实现也是利用了元表。 



     weak_t = {} 



     -- 给t设置一个元表,增加__mode元方法,赋值为“k” 

     setmetatable(weak_t, {__mode = "k"}); 



     weak_key1 = {name = "my"} 

     weak_t[weak_key1] = 1 

     weak_key1 = nil 



     weak_key2 = {name = "wife"} 

     weak_t[weak_key2] = 2 

     weak_key2 = nil 



     -- 强制进行一次垃圾收集 

     --collectgarbage();  -- 单词barbage垃圾的意思 

     -- 这时候weak_t已经是一个空的table了 

     if next(weak_t) then 

         print("exist") 

     else 

         print("null") 

     end 

     print("weak_reference") 

     for Key, Value in pairs(weak_t) do 

         print(Key.name .. ": " .. Value)  -- 这个时候输出的结果为空 

     end 



     --    3.三种形式的弱引用 



     --对于弱引用table,其实有三种形式: 



     --1)key值弱引用,也就是刚刚说到的情况,只要其他地方没有对key值引用,那么,table自身的这个字段也会被删除。设置方法:setmetatable(t, {__mode = “k”}); 

     --2)value值弱引用,情况类似,只要其他地方没有对value值引用,那么,table的这个value所在的字段也会被删除。设置方法:setmetatable(t, {__mode = “v”}); 

     --3)key和value弱引用,规则一样,但是key和value都同时生效,任意一个起作用时都会导致table的字段被删除。设置方法:setmetatable(t, {__mode = “kv”}); 



     local value1 = "du" 

     local value2 = "gao" 

     local key1 = 1 

     local key2 = 2 

     weak_t_v = {} 

     setmetatable(weak_t_v, {__mode = "k"}); 

     weak_t_v[key1] = value1 

     weak_t_v[key2] = value2 



     key1 = nil 

     key2 = nil 



     for Key, Value in pairs(weak_t_v) do 

         print(Value) 

     end 



     print("collectgarbage") 

     --collectgarbage() 



     --for Key, Value in pairs(weak_t_v) do 

     --    print(Value) 

     --end 



     -- 上面不管是对 value1=nil 或 key1 = nil  都无法把表给清空 因为只对table有效 



     local value11 = {name = "du"} 

     local value22 = {name = "gao"} 



     weak_t_v2 = {} 

     setmetatable(weak_t_v2, {__mode = "v"}); 

     weak_t_v2[1] = value11 

     weak_t_v2[2] = value22 



     value11 = nil 

     value22 = nil 



     for Key, Value in pairs(weak_t_v2) do 

         print(Value) 

     end 



     print("collectgarbage") 

     collectgarbage() 

     -- 这个时候table已经是空的了 

     if next(weak_t_v2) then 

         print("exist") 

     else 

         print("null")   

     end 



     for Key, Value in pairs(weak_t_v2) do 

         print(Value)  -- 输出 table 

         print(Value.name)  -- 输出 table 

     end 



    -- 语法小技巧 

    local x = x or v 

    local  x = a and b or c 

    local a = b == "dugaoda" -- 



    --2015年1月30日 10:07:00 

    local num16_1 = 0x56 

    local num16_2 = 0xff 

    print(num16_1) 

    print(num16_2) 



    --注:前面说过,Lua中的变量,如果没有local关键字,全都是全局变量,Lua也是用Table来管理全局变量的,Lua把这些全局变量放在了一个叫“_G”的Table里。 



     --__add(a, b)                     对应表达式 a + b 

     --__sub(a, b)                     对应表达式 a - b 

     --__mul(a, b)                     对应表达式 a * b 

     --__div(a, b)                     对应表达式 a / b 

     --__mod(a, b)                     对应表达式 a % b 

     --__pow(a, b)                     对应表达式 a ^ b 

     --__unm(a)                        对应表达式 -a 

     --__concat(a, b)                  对应表达式 a .. b 

     --__len(a)                        对应表达式 #a 

     --__eq(a, b)                      对应表达式 a == b 

     --__lt(a, b)                      对应表达式 a < b 

     --__le(a, b)                      对应表达式 a <= b 

     --__index(a, b)                   对应表达式 a.b 

     --__newindex(a, b, c)             对应表达式 a.b = c 

     --__call(a, ...)                  对应表达式 a(...) 



     local table1 = {1, 2} 

     local table2 = {2, 3} 

     local metameathon =  

     { 

     __add = function(a, b)  -- 重载加号运算符  

             temp = {} 

             temp[1] = a[1] - b[1] 

             temp[2] = a[2] - b[2] 

             return temp 

         end 

     } 

     setmetatable(table1, metameathon) 

     local table3 = table1 + table2 

     for Key, Value in ipairs(table3) do 

         print(Value)    -- 输出 -1 -1 

     end 



      

     local table12 = {[1] = "a", [2] = "b", [3] = "c", [26] = "z"} 

     local mymxan = table.maxn(table12)  --  

     print(mymxan)  -- 输出26 



     -- 升序排列 

     local tbl = {"du", "gao", "da", "ha"} 

     table.sort(tbl) 

     print(table.concat(tbl, ":")) 



     local tab23 = {10, 20, 39, 392} 

     table.sort(tab23)  

     print(table.concat(tab23, ":")) 



     local guild1 = {} 



     table.insert(guild1, { 

     name = "Cladhaire", 

      class = "Rogue", 

       level = 70, 

     }) 



     table.insert(guild1, { 

      name = "Sagart", 

      class = "Priest", 

       level = 70, 

     }) 



     table.insert(guild1, { 

     name = "Mallaithe", 

     class = "Warlock", 

     level = 40, 

     }) 



     mysortmethon = function(a, b) 

         if a.level == b.level then 

             return a.name < b.name 

         else 

             return a.level < b.level 

         end 

     end 

     table.sort(guild1, mysortmethon) 

     for Key, Value in ipairs(guild1) do 

         print(Value.name) 

     end 



     --tolua.isnull是判断一个userdata是否存在或者已经被释放的。如果传入的参数不是userdata,当然会返回true。  

     local p1 = tolua.isnull("sdfe")  -- 返回true 

     local p2 = tolua.isnull(null)    -- 返回true 

     local p3 = tolua.isnull({})      -- 返回true 



     --2015年2月2日 09:07:29 

     local table123 = {3, 234, 45, xing  = "du", ming = "gao", 2340, 92, 10, wifi = "mima"} 



     table.foreachi(table123, function(i, v) print(v) end) -- 只输出数字的数字key 

     table.foreach(table123, function(i, v) print(v) end) -- 输出整个表 



     -- 返回从一个unix时间值 

     -- 10800 = 3*60*60 (3 hours) 向西3个时区 

     print(os.time{year=1970, month=1, day=1, hour=0})  --> 10800   



      -- 返回当前用户机器上的时间. 

     local timetemp = os.date("*t", 906000490) 

     -- timetemp = {year = 1998, month = 9, day = 16, yday = 259, wday = 4, 

     -- hour = 23, min = 48, sec = 10, isdst = false} 

     print(os.date("%x", 906000490)) 

     --> 09/16/1998 

     --函数os.clock返回执行该程序CPU花去的时钟秒数 

     --getfenv(function or integer) - 返回此表已获取函数的堆栈结构或者堆栈等级 

     --setfenv(function or integer, table) - 设置此表已获取函数的堆栈结构或者堆栈等级