Ruby nil概念詳解
Ruby語言在實(shí)際應(yīng)用中可以幫助我輕松的解決許多問題。在這里我們將會(huì)為大家詳細(xì)解讀有關(guān)Ruby nil的一些概念,希望能對(duì)大家的學(xué)習(xí)有些幫助。#t#
我們常常處理這樣的代碼:
name=person?person.name:nil
取某個(gè)對(duì)象的一個(gè)屬性,先判斷對(duì)象是否為nil,不是Ruby nil就返回對(duì)象屬性,否則返回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ò)展,為每個(gè)對(duì)象實(shí)例增加了一個(gè)nil_or方法,分析下這個(gè)方法:如果對(duì)象不為Ruby nil,馬上返回self(也就是對(duì)象本身),否則生成一個(gè)新的對(duì)象,這個(gè)對(duì)象通過method_missing機(jī)制將所有的方法調(diào)用都返回nil(原文是用Class.new,生成的類將不會(huì)被GC,這里采用回復(fù)給出的方案,生成對(duì)象,在對(duì)象的metaclass上做method_missing)。那么現(xiàn)在代碼可以寫成:
name=person.nil_or.name是不是相當(dāng)?shù)腄SL呢?