<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
    主站蜘蛛池模板: 亚洲一级免费视频| 亚洲综合亚洲国产尤物| 亚洲国产成人精品无码区二本| 色播精品免费小视频| 亚洲欧洲日产国码www| 最近中文字幕无免费| 亚洲经典在线中文字幕| 国产黄色免费网站| 国产成人精品亚洲日本在线 | 色www永久免费网站| 亚洲一级片免费看| 免费看少妇高潮成人片| 亚洲AV日韩精品久久久久| 69视频在线是免费观看| 亚洲videos| 亚洲国产精品综合久久一线 | 一区二区三区免费在线视频 | 热久久精品免费视频| 337P日本欧洲亚洲大胆艺术图| 亚洲国产成人久久精品99 | 二个人看的www免费视频| 久久亚洲AV无码精品色午夜麻| 无码囯产精品一区二区免费| 亚洲成年人电影网站| 韩国18福利视频免费观看| 一区免费在线观看| 亚洲av永久无码精品网站| 97性无码区免费| 老司机午夜性生免费福利| 国产精品亚洲A∨天堂不卡| 成人免费午夜无码视频| 美女视频黄频a免费大全视频| 亚洲色爱图小说专区| 2020久久精品国产免费| 美女免费视频一区二区三区| 亚洲妇熟XXXX妇色黄| 国内自产拍自a免费毛片| 在线观看免费视频网站色| 亚洲中文字幕人成乱码| 国产午夜亚洲精品理论片不卡 | 又粗又长又爽又长黄免费视频|