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

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

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

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    Ruby小技巧:處理方法調用中的nil

    Posted on 2008-02-19 13:39 dennis 閱讀(844) 評論(1)  編輯  收藏 所屬分類: 動態語言
        讀blog看到的一個小技巧,原文在這里
        我們常常處理這樣的代碼:
    name=person?person.name:nil

        取某個對象的一個屬性,先判斷對象是否為nil,不是nil就返回對象屬性,否則返回nil。這樣的代碼寫多了比較惡心,是否有比較有趣的方式來減少代碼?作者給出了一段代碼:
    module ObjectExtension
     
    def nil_or
      
    return self unless self.nil?
      o 
    = Object.new
      
    class << o
        
    def method_missing(sym, *args); nil; end
      end
      o
      end
    end
    class Object
      include ObjectExtension
    end

       上面的代碼為Object加入了擴展,為每個對象實例增加了一個nil_or方法,分析下這個方法:如果對象不為nil,馬上返回self(也就是對象本身),否則生成一個新的對象,這個對象通過method_missing機制將所有的方法調用都返回nil(原文是用Class.new,生成的類將不會被GC,這里采用回復給出的方案,生成對象,在對象的metaclass上做method_missing)。那么現在代碼可以寫成:
        name=person.nil_or.name
    是不是相當的DSL呢?


    評論

    # re: Ruby小技巧:處理方法調用中的nil  回復  更多評論   

    2011-04-02 23:26 by 劉曉琦
    不覺得怎么好
    def self.call_method_for_object(params={:object=>"" , :method_name=>"" , :if_nil_return=>"" , :params=>[]})
    return params[:if_nil_return] if params[:object].nil?
    params[:object].send(params[:method_name], *(params[:params])||[])
    end

    我這個實現的是,如果對象為空,那可以返回默認的值。不過,我覺得我這個也有些麻煩。
    有好的建議可以email聯系。
    ericliu1002000@163.com
    主站蜘蛛池模板: 色噜噜AV亚洲色一区二区| 免费视频专区一国产盗摄| 亚洲AV中文无码乱人伦在线视色| 亚洲人成伊人成综合网久久| 在线免费中文字幕| 亚洲欧洲日产国码www| 国产精品久久免费| 亚洲一级毛片免费在线观看| 最新中文字幕电影免费观看| 亚洲欧美日韩综合久久久久| 四虎AV永久在线精品免费观看| 国产亚洲欧美日韩亚洲中文色| 免费无遮挡无码永久在线观看视频| 羞羞漫画小舞被黄漫免费| 亚洲日本中文字幕一区二区三区 | 免费人成又黄又爽的视频在线电影| 国产在线不卡免费播放| 一级做a免费视频观看网站| 亚洲VA成无码人在线观看天堂 | 无码av免费毛片一区二区 | 久久久久国色AV免费观看| 久久精品国产亚洲综合色| 久久国产精品成人片免费| 亚洲砖码砖专无区2023| 免费**毛片在线播放直播| 国产一级一毛免费黄片| 亚洲理论在线观看| 日本一道一区二区免费看 | 亚洲一区二区三区高清在线观看 | 亚洲?v无码国产在丝袜线观看 | 亚洲一区在线观看视频| 国产免费卡一卡三卡乱码| 中文字幕在线免费看| 亚洲成av人片在线看片| 国产成人3p视频免费观看| 黄色片免费在线观看| 亚洲日本在线电影| 亚洲产国偷V产偷V自拍色戒| 无码中文在线二区免费| 中文字幕成人免费高清在线| 中文字幕亚洲码在线|