[quote]
[img]
[/quote]
對此略懂, 簡單解答下你的問題, 這塊確實是ruby深入理解的關鍵點.
首先,要明白一點: ruby一切皆物件.
什麼意思呢? ruby乙個類也是乙個物件(使用xx.class知道它的類是class),它也具備方法(即所謂的類方法). 這個可以稱之謂元類(metaclass)
而ruby中呼叫方法邏輯很簡單:
1. 查詢該物件所屬類中的所有方法,如果存在呼叫之,如果不存在則呼叫父類的方法.
2. 如果回溯到頂級類,還不存在則呼叫method_missing, 預設丟擲nomethoderror異常.
那分析下該輸出
i1 = t1.new
puts "i1.get_v1: #" #輸出 bbb in init ##i1屬於類t1的例項,呼叫t1的方法get_v1,得到結果.
puts "t1.get_v1: #" #輸出 ! aaa ! ##這裡呼叫t1的元類,即所寫的self.get_v1, 得到 ! aaa !
puts "i1.v1: #" #輸出 bbb in init ##與第乙個一致, 值得一提,attr_xx 系列方法是乙個魔法,是module中提供的方法,用在這裡生成新的方法.
puts "i1.get2: #" #輸出 ! @@ v2 ! ##這個類變數輸出,通過例項取得類變數的值.
puts "i1.get3: #" #輸出 @@ v3 in init ##同上
puts "i1.v3: #" #輸出 這裡是空的 ## 未賦值,當然是空的. 記住在方法中self指向類,而在類中self指向元類.所以在類中使用@var賦值,這個變數屬於元類而不是你期望的類.
puts "i1.vtest: #" #輸出 vtest ## 這個同之前的分析
#puts "t1.vtest: #" 報錯 ##元類不存在該方法,當然報錯,你可以使用 class <#attr_reader :vtest
#end
來開啟元類的該方法,當然再賦個值,要不是空值.
這裡講的比較簡單,參考:
更可以搜尋google: 關鍵字 ruby metaclass
類方法與例項方法
人生如逆旅,我亦是行人。蘇軾 臨江仙 送錢穆父 例項方法 當乙個類建立了乙個物件後,這個物件就可以呼叫該類的方法 物件方法 即 物件名.方法名 的方式 1.例項方法中可以引用物件變數,也可以引用類變數 2.例項方法中可以呼叫類方法 3.物件方法中可以使用super,this關鍵字。類方法 用stat...
C 類方法與例項方法
類方法 使用static修飾,屬於整個類的,不是屬於某個例項的,只能處理static域或呼叫static方法 例項方法 屬於物件的方法,由物件來呼叫。乙個類中的方法可以互相呼叫。但要注意 例項方法可以呼叫該類中的其他方法。類方法只能呼叫其他類方法,不能呼叫例項方法。當類檔案載入到記憶體時,例項方法不...
ruby中類變數與例項變數
以 開始的變數是 例項變數 例項變數屬於特定的物件。class person def initialize name,gender,age name name gender gender age age endend 上面的例子中,name,gender,age都是例項變數。可以在類或子類的方法中引...