3.8.4 Object Class and Object Type
在這一大堆的Object下,要找到其所屬的類別還真的是有點麻煩,特別是我們又不知道有哪些類別的時候= =,所以還好萬物階OO的Ruby有提供了幾個Method來用,如果先前有留心例子的話應該都有看過了,不過沒關係,再看一下吧:
http://gist.github.com/292409.js?file=gistfile1.rb
酷哦,有看到的就賺到了,因為這邊除了Object#class這個Method外,還提到了Class#superclass這個Method,可以用串接的方式一直串下去,找到階層架構下最項層的Class直到nil。
但是在Ruby1.9下就有點不一樣了,Object在階層架構下不再是Root的角色(如上例):
http://gist.github.com/292412.js?file=gistfile1.rb
True,Object上面還有一個叫做BasicObject的parent class,再上去才是nil,這和Ruby1.8有點不一樣,可能要注意一下。這在後面的7.3還會有更詳細的說明,就先丟者吧XD
所以要判斷一個Object的類別就可以這樣做啦:
http://gist.github.com/292414.js?file=gistfile1.rb
當然也還有另一個選擇:
http://gist.github.com/292418.js?file=gistfile1.rb
當然,如果要再進階一點,你還可以這樣玩:
http://gist.github.com/292422.js?file=gistfile1.rb
大概了解了一下那些函式的玩法,這邊又提到一個「===」運算子可以代替「is_a?」這個Method,所以上面有用到該Method的都可以改成「===」來玩,在這邊有說到,不要了解該Object的類別,我們只要知道有哪些Method可以用就好了(暫時),要不然我們應該會陷入鬼影追追追的Loop吧XD。
另外如果我們想要知道該Object有沒有那個Method的話,可以這樣子測試:
http://gist.github.com/292427.js?file=gistfile1.rb
3.8.5 Object Equality
講完了一堆霧沙沙的Method,也只有等哪天真的要測試的時候會比較有用,不過就先記下來自己研究吧XD(懶人),在這邊要來討論一下比較Object的一些相同性。
3.8.5.1 The equal? method
這個「equal?」的Method是被定義在Object這個類別下,用來測試兩個值是不是參考到同一個Object用的,對於兩個不同的Object的話,就會回傳False,來看VCR:
http://gist.github.com/292433.js?file=gistfile1.rb
OH,MY,這個真是個經典的例子,如果在前面幾章的地方,我們有討論到字面上去宣告一個Object會產生的情形,就是每一個值都會參考到不同的Object,而這邊就是再次使用了這個例子來做說明,讓我們知道雖然兩個Object都叫做「Ruby」,但是其實是代表不同的「Ruby」,所以B、C都參考到了同一個「Ruby」,而A則參考到了另外一個,也就是為什麼一個euqal?的結果為False,另一個卻是True的原因了。
不過我們也可以用「==」來做到相同的事,只要A.object_id == b.object_id就可以啦,因為先前提到的,每個Object都會被授與一個Unique的Object Id,不知道大家還記不記得XD,還好我還沒忘記咧,差點就要被你們唬爛過去了QQ。
好啦,先玩到這邊,晚點再來寫別的內容,大家快去吃東西吧XD。