天天看點

[RubyHackingGuide]Ruby的對象類

Ruby世界中,萬物皆對象. 用Ruby"寫作"時, 書寫下"名詞", 對這些"名詞"進行修辭: 用"形容詞(修飾性的名詞)"豐富它們, 用"動詞"讓它們活潑.用OO語言來說, "對象可以擁有屬性, 并響應消息".

我們知道如何用Ruby的OO文法建立類并執行個體化對象.但這一切是如何用C語言實作的呢?簡單的說, Ruby世界中任何對象都對應C語言中的某個"變量", 而所有這些變量的類型由一些結構體(Struct)定義. 對象可修飾,可操作都是源于這些結構體.

那麼來看下C中Ruby對象所對應的結構體(即所謂Ruby對象所對應的'C類', 對象類)有哪些:

# struct RObject  下面之外的所有東西  
# struct RClass   類對象  
# struct RFloat   小數  
# struct RString  字元串  
# struct RArray   數組  
# struct RRegexp  正規表達式  
# struct RHash    hash表  
# struct RFile    IO, File, Socket等等  
# struct RData    所有定義在C層次上的類,除了上面提到的。  
# struct RStruct  Ruby的Struct類  
# struct RBignum  大的整數  
           

除了RObject, RClass, RData, RStruct外, 其它的對象類都很好了解, 例如RString這個結構體就表示了Ruby中的String類.

呵呵, 可能你也發現了錯誤, 是的, 在Ruby的C實作中,RString類型的變量代表Ruby中String類的執行個體, 但RString這個類型, 卻不代表String這個Ruby類.

到此,你可能會有這樣的疑問: 為什麼RString類型的變量對應Ruby對象, RString卻不是Ruby對象的類型---Ruby類, 的對應呢? 什麼樣的C結構才是Ruby類所對應的呢?

第一個問題, 萬物皆對象, Ruby類也是一種對象, 換句話說, 你可以在運作時操縱Ruby類, 它可以像普通對象那樣, 編輯屬性, 接受消息.是以, 如果用C的類型(Struct)和變量直接對應Ruby的類和執行個體是不妥當的:你無法在運作時操縱C的類型(Struct)!

那麼, Ruby類作為對象, 所對應的C結構體('類'對象類)是什麼呢? '類'對象是對象的一種, '類'對象類也應該是對象類的一種. 是的, 其實你已經看到了Ruby類作為對象,所對應的C結構體----RClass.

上述的對象類,并沒有包含所有的Ruby對象, 例如小整數, 符号, true, false, nil.這方面的知識, 請參見C層面上"指向/引用"一切ruby對象的"指針"類型[url=http://winteen.iteye.com/admin/blogs/426622]VALUE[/url].

一般意義上的Ruby對象, 在C層面上是一個對象類(除RClass)類型的變量, 那麼它們在Ruby層面上響應它們的Ruby類所定義的那一套方法, 又是如何實作的呢? 換句話說, 對象類到底是如何既分離了Ruby對象的實作,又讓它們具有Ruby層次上定義的類型(接口)呢?關于這一點, 請先參見[url=http://winteen.iteye.com/admin/blogs/427268]RBasic[/url].

内建的Ruby類(String, Hash, 或Fixnum這種沒有真正對象類的)和使用者自定義的對象類在C層面上都是一個RClass類型的變量. 在Ruby層面, 不同的類定義不同的方法, 變量, 那麼這一點是如何在C層面實作的呢? 請參見[url]RClass[/url].