莊周夢蝶

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

          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ò)展,為每個對象實例增加了一個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

          我這個實現(xiàn)的是,如果對象為空,那可以返回默認(rèn)的值。不過,我覺得我這個也有些麻煩。
          有好的建議可以email聯(lián)系。
          ericliu1002000@163.com
          主站蜘蛛池模板: 阿巴嘎旗| 伊金霍洛旗| 如东县| 大庆市| 普兰店市| 金秀| 怀宁县| 万荣县| 天长市| 玉溪市| 隆林| 仙游县| 永定县| 商水县| 德江县| 平顶山市| 嵩明县| 延长县| 扎兰屯市| 迁西县| 西吉县| 乐至县| 北川| 改则县| 芦溪县| 和顺县| 宜宾市| 通河县| 新源县| 新建县| 蒲江县| 额济纳旗| 溆浦县| 固原市| 新民市| 巫山县| 凤冈县| 美姑县| 韩城市| 日喀则市| 新疆|