2011-08-31 102 views
1

現在我寫了多次努力來理解紅寶石的對象模型後,我感到困惑:以下是我的觀察。ruby​​中類的類型和超類的區別是什麼?

class Bird 
    def speak 
    puts "tweet tweet" 
    end 
end 

>> Bird.class 
=> Class 
>> Class.class 
=> Class 
>> Class.superclass 
=> Module 
>> Module.class 
=> Class 
>> Module.superclass 
=> Object 
>> Object.class 
=> Class 
>> Object.superclass 
=> nil 
>> nil.class 
=> NilClass 
>> NilClass.class 
=> Class 
>> NilClass.superclass 
=> Object 
and keeps going on .... 

這是怎麼回事?什麼位於祖先的零點或NilClass或Object或Class? Ruby的對象模型是如何組織的。

什麼是類和什麼是對象?是一個類還是一個對象?對象是對象還是類?

+0

可能會很有意思:[Ruby Inheritance](http://rubylearning.com/satishtalim/ruby_inheritance.html) - 請注意1.8和1.9在樹上不一致。 – 2011-08-31 22:45:23

+0

我正在使用1.8.7 MRI – pankajdoharey

+0

在Ruby 1.9+中,「對象」。超類'返回'BasicObject' – pje

回答

2

它有點棘手。在Ruby中,一切都是一個對象(取決於你的版本)。

  • 無有它自己的NilClass,因爲它不允許NilClass.new,哪個對象和類允許。它是一個對象,所以你可以像nil.nil一樣調用它的方法?等等。
  • 對象是最高類,一切都從Object繼承,甚至NilClass類也是一個對象,它知道如何用新方法實例化對象本身。

起初真的很奇怪,但是我發現戴夫托馬斯的解釋頗有啓發。

參見:http://www.infoq.com/presentations/metaprogramming-rubyhttp://pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming。後者是商業性的。

+0

BasicObject是以上對象在1.9+ – 2011-08-31 22:47:28

+0

取決於您的版本:) – ayckoster

2

可以斷定,你的例子如下:

  1. 出現在您的示例腳本指向一個類(BirdClassModuleObjectNilClass)寫成大寫的每一個名字。
  2. 每個班級依次是Class類型的對象(這就是爲什麼X.class總是在您的示例中返回Class)。
  3. X.superclass返回基類X
  4. Object.superclass返回nil,因爲它沒有基類!這確實意味着基類對象是NilClass甚至nil(這是不是一個類型,而是一個實例)
  5. 所涉及類的繼承圖看起來像:

    Object (top-level)  Object  Object 
        |      |   | 
    Module     Bird  NilClass 
        | 
    Class 
    
+0

但在1.9.2 ...'Object.superclass => BasicObject'和'BasicObject.superclass => nil' – 2011-08-31 22:48:43

+0

這是真的,這就是爲什麼我寫了「你可以從你的例子中得出以下結論」。 –

0

我認爲你對實例(如nil)和類(如NilClass)之間的差異感到困惑。這很有道理,因爲Ruby類(NilClass)也是實例。因此:一個類是一個實例。一個實例不是一個類,雖然除非它是一個類。

Here's a detailed hierarchy,它由ObjectGraph製成。

+0

但在1.9.2 ...'Object.superclass => BasicObject' – 2011-08-31 22:47:59

1

Class爲一個對象返回一個類(而一個類是一個對象)。超類是(派生)類的父類。請致電Ruby Object Model

+0

最佳答案IMO。 –

5

在ruby中,類對象實際上是Class類的一個實例。 class Foo是幾乎相同的Foo = Class.new

MyClass = Class.new 
instance = MyClass.new 
puts instance # => #<MyClass:0x100c14b38> 

另外,class方法是更多的設計被稱爲上的實例,而不是類對象。

class Foo 
end 

f = Foo.new 
puts f.class # => Foo 

調用類對象時,語義可能很奇怪。儘管superclass的工作方式與您對類對象的期望相同。

所以鑑於這一切讓解釋這些一個接一個:

>> Bird.class 
=> Class 

Bird類對象有一個類的Class,因爲所有的類對象是Class類的實例。

>> Class.class 
=> Class 

沒錯甚至ClassClass一個實例。在這種情況下,它實際上是一個循環參考。

>> Class.superclass 
=> Module 

Class類實際上是從Module繼承。畢竟,一個類只是一個可以實例化的模塊。但是所有非實例功能都與模塊非常相似。

>> Module.superclass 
=> Object 

Module繼承自Object。就像紅寶石裏的一切,如果你回到足夠遠。

>> Object.class 
=> Class 

同樣所有的類對象是Class實例。

>> Object.superclass 
=> nil 

所有紅寶石的一切都始於Object。它是一切的基礎類。因此它沒有超類。

>> nil.class 
=> NilClass 

nil實際上是引擎蓋下的NilClass一個實例。 NilClass定義了nil響應的方法。如果需要,您甚至可以將方法添加到NilClass。還有一個TrueClass和一個FalseClass

>> NilClass.class 
=> Class 

再次,所有類對象都是Class的實例。從Object這樣沒有指定明確的超任何類

>> NilClass.superclass 
=> Object 

NilClass繼承。

+0

應該指出,在1.9+上有'Object.superclass => BasicObject',所以後面和上面的結果可能並不適合每個人。 – 2011-08-31 22:50:23

+0

是的,我還沒有玩過1.9,說實話:(所以請糾正任何不一致的東西。但是,儘管如此,我仍然認爲它是1.8.7。 –

相關問題