終於來到了Ruby的重點了,即「萬物皆物件」的重點章節-「物件(Object)」!
3.8 Objects
在書中,直接使用了高中老師教我的破題法,一開始就來個下馬威說「Ruby是個非常物件導向的語言,所有的值都是物件」,而且提到了一個很重要的概念,它說「所有的物件都是先繼承『Object』這個類別」,所以它的Method都可以直接被使用,真是重要的一點!!
在這章就介紹一些基本的資訊,雖然不多,卻是打基礎重要章節!!
3.8.1 Object References
在Ruby下,當我們在使用物件的時候,我們是在使用它的「參考(References)」,並不是直接使用物件本身。舉例來說,當我們Assign一個值給一個變數的時候,我們不是把整個物件複製過去,反而只儲存一個「物件的參考」而已,就像是C語言內的Pointer的一樣。
耶,Live Demo:
http://gist.github.com/291478.js?file=gistfile1.rb
例子都直接先中文化了,應該還蠻清楚的,反正只要記得「物件參考」這個特性就好了,因為這也是這節最重要的概念。
所以我們在執Method的時候,就是利用Pass By Value(傳值)的方式把該物件的Reference當作一個參數傳進去,並不是該物件本身,因為Method就能透過該Reference來直接對整個Object做改變,就不需要把「整個物件」傳進去了,真是一個輕便的作法呀。
3.8.1.1 Immediate values
在上面說到萬物階物件的概念,不過這邊有了一個例外(人生就是很多例外XD?)那就是 Immediate values = 立即值。哇靠,這是什麼,在書上的解釋是說,該類的物件(如Fixnum和Symbol)在Assign或是傳遞時把整個物件都給它丟過去,而不是像上一小節說的reference。說實在的,我還是不知道它到底是想要幹嘛,不過最後面有提到「Immediate values」和「Reference」的主要差異是在前者不能有「Singleton Method」,XX的,這是雪球效應嗎,怎麼一個問題又產生了好多個問題,好在在CH.6的時候會說到這個很怪的Method,先放著等到那個時候再來討論,現在只要知道一下有這個東西就好,等到要用到時再來詳細討論一下(逃)。
3.8.2 Object Lifetime
在這邊說到,要宣告一個Object的話,如果不以「字面上(literally)」的方式,可以用new這個Method,來看一下例子:
http://gist.github.com/291501.js?file=gistfile1.rb
new是Class類別下的一個Method,它會產生一個區塊的記憶體空間來存放新的物件,然後會呼叫一個初始化的函式(initialize),並把傳給new Method的參數直接傳給它。媽呀,這怎麼有點複雜XD,應該是等後面要自己做自己的Class時才會用到這邊的東西,還是先丟著吧XD,要不然講一堆也不知道在幹嘛,我要例子啦!
3.8.3 Object Identity
每個物件都有一個識別用的identifier,像是在Fixnum下就有一個object_id的Method,會回傳一個獨特的物件id做為辨識。但是書上有提到在Ruby1.8這個Method會產生一個Warning,而在Ruby1.9也已經不採用這個Method了,但是可以改用__id__這個Method來做到相同的事情,不過經過我的測試,在Ruby1.8沒有Warning,在Ruby1.9 object_id也沒有被剔除,好像和書上說的有點不太一樣!?
前面還有些東西我晚點找到些資料再來修改一下。先準備來去吃東西XD