ruby元編程——類定義

(1)類是一個加強的模塊,因此全部類定義中的特性都一樣適用於模塊定義。ruby

(2)Ruby程序中老是存在一個當前對象:self,相似地,也總有一個當前類或模塊存在,當定義一個方法時,該方法將成爲當前類的一個實例方法。spa

(3)當經過class關鍵字打開一個類時,這個類就成爲當前類。code

(4)Module#class_eval()方法(module_eval())方法能夠在不知道類名的狀況下打開一個類,例:對象

def add_method_to(a_class)
    a_class.class_eval do
        def m
            'Hello'
        end
    end
end



(5)類變量是以@@開頭的變量,類變量與類實例變量不一樣,它們能夠被子類或者類的實例所使用繼承

(6)單件方法,能夠給當個對象添加方法,例:string

str = "Just a regular string"
def str.title?
    self.upcase == self
end
str.title?                                   #=>false
str.methods.grep(/title?/)      #=>["title?"]
str.singleton_methods           #=>["title?"]

(7)類方法的實質就是:它們是一個類的單件方法it

(8)Module#attr_reader()、attr_writer()、attr_accessor()能夠用於生成讀、寫、二者都生成class

(9)eigenclass,獲取一個eigenclass:變量

obj = Obejct.new
eigenclass = class << obj
    self
end
eigenclass.class        #Class

(10)eigenclass只有一個實例而且不能改被繼承module

(11)到調用一個對象調用單件方法時,若是對象有eigenclass,先去eigenclass找,再向上找父類

(12)alias :new_name :old_name 能夠用來給方法取別名。alias是個關鍵字,和他相似的還有一個Module#alias_method方法

(13)環繞別名:

(1)給方法定義一個別名

(2)重定義這個方法

(3)在新的方法中調用老的方法

(14)加上eigenclass後的類關係圖:

因爲圖已經比較亂了,Class類的class箭頭沒有給出,Class.class   #=> Class

從上圖,能夠看出不少的規律:

  • 一個類(class指向Class)和它的eigenclass以及父類和父類的eigenclass老是存在一個四角關係

  • 一個對象與他的類和對象的eigenclass老是存在一個三角關係

  • ruby真正的方法查詢,實際上是先找接收者的eigenclass,在向上找父類

  • 比較特殊的一點是BasicObject的eigenclass的父類是Class,因此全部的類按上面的方法查找方式,都會找到Class類,纔會都有new方法和superclass(new方法和superclass方法是Class的實例方法)

相關文章
相關標籤/搜索