閱讀755 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Ruby小技巧:處理方法調用中的nil

讀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呢?

文章轉自莊周夢蝶  ,原文發布時間 2008-02-19

最後更新:2017-05-17 17:31:49

  上一篇:go  java nio之Buffer(一)
  下一篇:go  JRuby 1.1 RC2 Released