<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一区二区无码| 国产亚洲视频在线| 免费一级毛片一级毛片aa| 亚洲av成人中文无码专区| 永久黄网站色视频免费直播 | 亚洲免费无码在线| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国产精品亚洲精品日韩已方| 五月天国产成人AV免费观看| 久久精品亚洲福利| 你是我的城池营垒免费看| 亚洲精品白浆高清久久久久久| a级毛片黄免费a级毛片| 亚洲av丰满熟妇在线播放| 最近免费中文在线视频| jlzzjlzz亚洲jzjzjz| 日本一道综合久久aⅴ免费| 免费看黄网站在线看 | 100部毛片免费全部播放完整| 亚洲1区1区3区4区产品乱码芒果 | 国产成人精品日本亚洲语音| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 免费人成再在线观看网站| 亚洲中文字幕视频国产| 蜜桃成人无码区免费视频网站 | 亚洲欧洲日韩国产| 毛片免费在线播放| 激情吃奶吻胸免费视频xxxx| 亚洲色大成网站www永久一区 | 免费无码看av的网站| free哆拍拍免费永久视频| 亚洲Av熟妇高潮30p| 午夜免费不卡毛片完整版| 人成午夜免费大片在线观看| 亚洲精品国产成人专区| 免费无码黄动漫在线观看| a级毛片在线免费观看| 国产亚洲精品影视在线|