莊周夢蝶

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

          Ruby小技巧:處理方法調(diào)用中的nil

          Posted on 2008-02-19 13:39 dennis 閱讀(846) 評論(1)  編輯  收藏 所屬分類: 動態(tài)語言
              讀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加入了擴(kuò)展,為每個對象實(shí)例增加了一個nil_or方法,分析下這個方法:如果對象不為nil,馬上返回self(也就是對象本身),否則生成一個新的對象,這個對象通過method_missing機(jī)制將所有的方法調(diào)用都返回nil(原文是用Class.new,生成的類將不會被GC,這里采用回復(fù)給出的方案,生成對象,在對象的metaclass上做method_missing)。那么現(xiàn)在代碼可以寫成:
              name=person.nil_or.name
          是不是相當(dāng)?shù)腄SL呢?


          評論

          # re: Ruby小技巧:處理方法調(diào)用中的nil  回復(fù)  更多評論   

          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

          我這個實(shí)現(xiàn)的是,如果對象為空,那可以返回默認(rèn)的值。不過,我覺得我這個也有些麻煩。
          有好的建議可以email聯(lián)系。
          ericliu1002000@163.com
          主站蜘蛛池模板: 福建省| 乌恰县| 邓州市| 璧山县| 收藏| 嘉义县| 临澧县| 广河县| 白城市| 长寿区| 桃园市| 忻州市| 烟台市| 石首市| 张掖市| 苗栗市| 西林县| 忻城县| 蓝山县| 荥经县| 大新县| 北安市| 乌兰县| 南江县| 利辛县| 黄大仙区| 新巴尔虎右旗| 碌曲县| 浦东新区| 巴马| 马山县| 宁蒗| 潍坊市| 昭通市| 瓦房店市| 旺苍县| 咸阳市| 兴和县| 罗田县| 色达县| 林周县|