<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    碼農往事
    我的代碼為什么這么丑?一定是因為我長的不好看
    posts - 29,comments - 86,trackbacks - 0
    最近的工作主要涉及LUA,這有個坑必須記一下。
    下面是一個LUA面向對象寫法非常常見的寫法。
    Bird = {
        color = {};canFly = true
    }

    function Bird:new(o)
        o = o or {}
        setmetatable(o, self)
        self.__index = self
        self.color = {}
        return o
    end
    注意,這里Bird類有兩個屬性,1個表,1個是基本類型,然后上測試代碼(Utils類只是簡單的封裝類,可以自己實現一個)
            local A = Bird:new()
            LoggerUtils:debug("------------------------------原始值-----------------------------------");
            LoggerUtils:debug("Bird canFly:" .. StringUtils.boolean2string(A.canFly));
            LoggerUtils:debug("Bird color:");
            CommonUtils.printTable(Bird.color)
            LoggerUtils:debug("a canFly:" .. StringUtils.boolean2string(A.canFly));
            LoggerUtils:debug("a color:");
            CommonUtils.printTable(A.color)
            --改變A的屬性
            A.canFly = false
            A.color[1] = "red"
            A.color[2] = "blue"
            A.color[3] = "green"
            LoggerUtils:debug("------------------------------A改變后----------------------------------");
            LoggerUtils:debug("Bird canFly:" .. StringUtils.boolean2string(Bird.canFly));
            LoggerUtils:debug("Bird color:");
            CommonUtils.printTable(Bird.color)
            LoggerUtils:debug("A canFly after change:" .. StringUtils.boolean2string(A.canFly));
            LoggerUtils:debug("A color after chagne:");
            CommonUtils.printTable(A.color)
            LoggerUtils:debug("-------------------------------B的值----------------------------------");
            local B = Bird:new()
            LoggerUtils:debug("B canFly:" .. StringUtils.boolean2string(B.canFly));
            LoggerUtils:debug("B color:");
            CommonUtils.printTable(B.color)

    代碼執行結果:
    2014-12-29 11:20:40,690 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: ------------------------------原始值-----------------------------------
    2014-12-29 11:20:40,690 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird canFly:true
    2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird color:
    2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: a canFly:true
    2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: a color:
    2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: ------------------------------A改變后----------------------------------
    2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird canFly:true
    2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird color:
    2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 1:red
    2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 2:blue
    2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 3:green
    2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: A canFly after change:false
    2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: A color after chagne:
    2014-12-29 11:20:40,693 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 1:red
    2014-12-29 11:20:40,693 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 2:blue
    2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 3:green
    2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: -------------------------------B的值----------------------------------
    2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: B canFly:true
    2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: B color:
    2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 1:red
    2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 2:blue
    2014-12-29 11:20:40,696 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 3:green
    發現神馬問題了嗎?
    當A的類型為表的屬性color改變時,原始類的color屬性也改變了,同時這個改變也影響到新建的B,而類型為基本類型的屬性canFly就沒有這個問題。
    我的解決方法是新增一個set方法:
    function Bird:setColor(color)
        self.color = color
    end

    然后修改改變屬性的方式:
    local color ={}
            color[1] = "red"
            color[2] = "blue"
            color[3] = "green"
            A:setColor(color)
    輸出結果:
    2014-12-29 11:31:58,648 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: ------------------------------原始值-----------------------------------
    2014-12-29 11:31:58,648 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird canFly:true
    2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird color:
    2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: a canFly:true
    2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: a color:
    2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: ------------------------------A改變后----------------------------------
    2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird canFly:true
    2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird color:
    2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: A canFly after change:false
    2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: A color after chagne:
    2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 1:red
    2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 2:blue
    2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 3:green
    2014-12-29 11:31:58,651 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: -------------------------------B的值----------------------------------
    2014-12-29 11:31:58,651 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: B canFly:true
    2014-12-29 11:31:58,653 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: B color:
    另外同事一個解決方法更簡單,直接修改new()方法,其它的地方都不用改:
    function Bird:new(o)
        o = o or {}
        setmetatable(o, self)
        self.__index = self
        o.color = {} 
        return o
    end
    這個問題基本上網上的示例貌似都沒提到,我讀的書里也沒有,實際調試過程中才發現的,會造成新創建的類里會有不該有的屬性,比較蛋疼。
    具體原因不了解,有木有筒子指教一下?順便問問這兩種方法哪種更好?
    posted on 2014-12-29 11:42 Jimi 閱讀(10775) 評論(5)  編輯  收藏 所屬分類: LUA

    FeedBack:
    # re: LUA 面向對象編程中的一個坑
    2014-12-29 16:53 | 威客
    很厲害博主  回復  更多評論
      
    # re: LUA 面向對象編程中的一個坑
    2015-01-04 15:47 | flyforlove
    你確定你寫的測試程序沒問題?  回復  更多評論
      
    # re: LUA 面向對象編程中的一個坑
    2015-01-05 09:39 | Jimi
    @flyforlove
    有問題麻煩請指出來  回復  更多評論
      
    # re: LUA 面向對象編程中的一個坑
    2015-01-30 18:27 | poetao
    --改變A的屬性
    A.canFly = false
    A.color[1] = "red"
    A.color[2] = "blue"
    A.color[3] = "green"
    ===改成如下就可以了===============
    A.canFly = false
    A.color = { "red", "blue", "green" }

    ===建議你詳細看下元表的__index實現  回復  更多評論
      
    # re: LUA 面向對象編程中的一個坑
    2015-03-07 11:15 | Jimi
    @poetao
    多謝指教  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 又黄又大的激情视频在线观看免费视频社区在线| 中国毛片免费观看| 亚洲精品无码专区2| 久久免费线看线看| 亚洲一区二区久久| 免费精品国产自产拍观看| 在线观看免费视频一区| 亚洲免费视频播放| 亚洲五月午夜免费在线视频| 亚洲国产精品免费视频| 亚洲精品国产综合久久久久紧| 久久精品国产亚洲一区二区三区| 天天影院成人免费观看| 一级中文字幕免费乱码专区| 97亚洲熟妇自偷自拍另类图片| 国产公开免费人成视频| 日韩精品久久久久久免费| 黄色毛片免费网站| 亚洲精品视频在线播放| 国产国拍亚洲精品福利| 青苹果乐园免费高清在线| 一本大道一卡二大卡三卡免费 | 日本免费一区二区三区最新vr| a级片在线免费看| 亚洲综合小说另类图片动图| 亚洲精品无码久久千人斩| 破了亲妺妺的处免费视频国产| 在线观看的免费网站无遮挡| 一级毛片完整版免费播放一区| 亚洲AV成人一区二区三区在线看| 亚洲第一中文字幕| 国产亚洲美日韩AV中文字幕无码成人| AA免费观看的1000部电影| 一级做a爰全过程免费视频| 一级女人18片毛片免费视频| 亚洲精品国产精品| 亚洲综合精品第一页| 在线免费观看亚洲| 国产亚洲美女精品久久久久狼| 亚洲欧洲中文日韩久久AV乱码| 成熟女人牲交片免费观看视频|