Tips
- 類名不過(guò)是常量
- 對(duì)象包含了實(shí)例變量,它就好像一個(gè)Hash表一樣。
- 方法存放在類之中。
類自身也是對(duì)象
"hello".class #=> String
String.class #=> Class
Class.class #=> Class
String.ancestors
#=> [String, Comparable, Object, Kernel, BasicObject]
Object.superclass
#=> BasicObject
Class.ancestors
#=> [Class, Module, Object, Kernel, BasicObject]
所有的類都是Class的子類,而Class繼承自Module。所以類只是比模塊多了
superclass(),new(),allocate()這三個(gè)方法。Kernel只是mixin在BasicObject里的一個(gè)模塊,它能出現(xiàn)在ancestors中,但并不代表Object繼承自Kernel。因?yàn)檫@個(gè)祖先鏈的關(guān)系,所以所有對(duì)象都能調(diào)用Kernel里的方法。
self
頂級(jí)上下文:
self #=> main
slef.class #=> Object
當(dāng)開(kāi)始運(yùn)行ruby程序的時(shí)候,解釋器會(huì)創(chuàng)建一個(gè)名為main的對(duì)象最為當(dāng)前對(duì)象,它被稱為頂級(jí)上下文(top level context)是因?yàn)檫@時(shí)處在調(diào)用堆棧的頂層:這時(shí)要么還沒(méi)有調(diào)用任何方法,要么調(diào)用的方法都已經(jīng)返回了。P.S. Ruby的main對(duì)象和C系的main函數(shù)沒(méi)有關(guān)系。
private
- 如果調(diào)用方法的接收者不是自己,則必須指明一個(gè)接收者;
- 私有方法只能被隱含接收者調(diào)用;
所以,不能明確指定一個(gè)接收者調(diào)用一個(gè)私有方法,即每次調(diào)用私有方法只能用隱含的接收者self調(diào)用。
所以與C系語(yǔ)言不同的是,子類可以調(diào)用基類的私有方法。