Ruby類例項變數、類例項方法和類變數、類方法的區別

NO IMAGE

在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

您可能感興趣的文章:

詳解Ruby中的單件方法和單件類Ruby物件導向程式設計中類與方法的基礎學習Ruby中的Proc類及Proc的類方法Proc.new的使用解析Ruby物件導向程式設計中類的方法與類的擴充套件