在Ruby中類執行個體變數、類執行個體方法和類變數、類方法的區別比較微妙,而且用法也有相當的區別。本文探討一下他們的定義和基本的使用情境,以拋磚引玉...
一.類執行個體變數和類變數
類變數大家都很熟悉了,就是在類定義中用@@開頭的變數。類變數是用於儲存類的全域資訊,它只屬於類,不同與類執行個體變數(即用@開頭定義的變數)每一個類的對象都有一份資料。 類變數是可以被繼承的,也就是說如果我們派生一個子類,那麼在子類中是可以訪問父類的類變數的。子類和父類共用一份資料,對一個類的修改會反映到另一個類中。如下邊的代碼運行結果顯示:
複製代碼 代碼如下:
class A
#類變數在訪問前必須賦值,否則會有"uninitialized class variable“ 錯誤
@@alpha=123 # Initialize @@alpha
@@beta=456 #Initialize @@beta
@@gamma=789 #Initialize @@gamma
def A.alpha
@@alpha
end
def A.alpha=(x)
@@alpha=x
end
def A.beta
@@beta
end
def A.beta=(x)
@@beta=x
end
def A.gamma
@@gamma
end
def A.gamma=(x)
@@gamma=x
end
def A.look
puts "#@@alpha, #@@beta, #@@gamma"
end
end
class B<A
end
#初始的資料
A.look
B.look
#修改父類中的類變數
A.alpha=111
A.look
B.look
運行結果:
複製代碼 代碼如下:
123, 456, 789
123, 456, 789
111, 456, 789
111, 456, 789
那麼什麼是類的類執行個體變數呢?類的類執行個體變數是在類的類方法中或方法外邊(不能在執行個體方法中,那是類的執行個體變數)以@開頭定義的變數,這樣定義的變數值屬於類對象本身,不能夠被子類繼承。類對象這個說法可能有些讓人疑惑,其實Ruby中的一起都是對象,我們定義的類和Ruby的內建類本身就是元類的對象。因此如果要定義需要和子類共用的類全域資料,使用類變數;但是如果要定義僅供類本身使用的類全域資料可以使用類執行個體變數。還有一點需要注意的是,和類變數不同的是類執行個體變數不要求訪問前必須賦值,不賦值它的值就是nil 。我們還是看一個例子,能夠更清楚一點...
複製代碼 代碼如下:
class A
#類的類執行個體變數在訪問前可以賦值也可以不賦值,不賦值就是nil
@alpha=123 # Initialize @alpha
@beta=456 #Initialize @beta
@gamma=789 #Initialize @gamma
def A.alpha
@alpha
end
def A.alpha=(x)
@alpha=x
end
def A.beta
@beta
end
def A.beta=(x)
@beta=x
end
def A.gamma
@gamma
end
def A.gamma=(x)
@gamma=x
end
def A.look
puts "#@alpha, #@beta, #@gamma"
end
end
class B<A
end
A.look
B.look
代碼的運行結果如下:
複製代碼 代碼如下:
123, 456, 789
, ,
nil