關於Ruby中類方法與例項方法呼叫的理解

2021-08-31 22:18:17 字數 1073 閱讀 3747

[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都是例項變數。可以在類或子類的方法中引...