<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
    主站蜘蛛池模板: 亚洲国产成人片在线观看无码| 热re99久久6国产精品免费| 亚洲精品国产精品| 最新国产精品亚洲| 亚洲综合av一区二区三区 | 国产精品免费_区二区三区观看| 在线观看日本免费a∨视频| 青青青国产在线观看免费| 18国产精品白浆在线观看免费| 成人免费在线看片| 免费一本色道久久一区| 成年轻人网站色免费看| 日本高清免费aaaaa大片视频| 国产又大又长又粗又硬的免费视频| 日韩视频免费在线| 免费播放特黄特色毛片| 亚洲精品97久久中文字幕无码| 亚洲日韩中文字幕日韩在线| 中文字幕人成人乱码亚洲电影| 亚洲高清国产AV拍精品青青草原| 亚洲欧洲自拍拍偷午夜色无码| 亚洲国产精品无码专区影院| 亚洲一区二区三区四区在线观看| 亚洲国产韩国一区二区| 精品久久久久久亚洲精品| 亚洲国产精品精华液| 无码 免费 国产在线观看91| 国产午夜不卡AV免费| 在线免费观看你懂的| 国产美女在线精品免费观看| 国产乱色精品成人免费视频| 亚洲午夜久久久影院伊人| 亚洲图片一区二区| 亚洲人成网站免费播放| 一级毛片高清免费播放| 国产精品免费无遮挡无码永久视频 | 亚洲伊人色一综合网| 久久精品国产亚洲av瑜伽| 两性色午夜免费视频| 永久看日本大片免费35分钟| 免费高清小黄站在线观看|