1. ホーム
  2. スクリプト・コラム
  3. ルア

Rubyのクラスインスタンス変数、クラスインスタンスメソッドとクラス変数、クラスメソッドの違いについて

2022-02-13 16:12:58

Rubyにおけるクラスインスタンス変数、クラスインスタンス・メソッド、クラス変数・メソッドの違いは微妙で、使い方もかなり異なります。この記事では、それらの定義と基本的な使用シナリオを調査し、光を当てる...
I. クラスインスタンス変数とクラス変数
クラス変数は誰もが知っている、クラス定義にある@@で始まる変数のことです。クラス変数は、クラスのグローバルな情報を格納するために使用され、クラスのオブジェクトごとにデータのコピーを持つクラスインスタンス変数(つまり@で定義された変数)とは異なり、そのクラスのみに属します。クラス変数は継承することができるので、サブクラスを派生させれば、サブクラス内の親クラスのクラス変数にアクセスすることができます。子クラスと親クラスはデータのコピーを共有し、一方のクラスに対する変更は他方のクラスに反映されます。下のコードは実行結果を示しています。

コピーコード コードは以下の通りです。

class A 
   # class variables must be assigned before they can be accessed, otherwise there will be an "uninitialized class variable" error 
  @@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 
#initial data 
A.look 
B.look 
#Modify class variables in the parent class 
A.alpha=111 
A.look 
B.look 

走った結果 
コピーコード コードは以下の通りです。

123, 456, 789 
123, 456, 789 
111, 456, 789 
111, 456, 789 

では、クラスのインスタンス変数とは何でしょうか?クラスのインスタンス変数とは、クラスのクラスメソッド内またはクラスメソッド外(インスタンスメソッド内ではない、クラスのインスタンス変数)で、@で始まる変数として定義されたものです。このように定義された変数の値は、クラスオブジェクト自身に属するもので、サブクラスに継承させることはできません。クラスオブジェクトというと少しわかりにくいかもしれませんが、実はRubyではすべてまとめてオブジェクトであり、私たちが定義するクラスやRubyの組み込みクラスはそれ自体がメタクラスのオブジェクトなのです。ですから、サブクラスと共有する必要があるクラスのグローバルデータを定義したい場合は、クラス変数を使います。しかし、クラス自身だけのグローバルデータを定義したい場合は、クラスインスタンス変数を使えばいいのです。また、クラス変数と異なり、クラスインスタンス変数はアクセスする前に値を代入する必要がなく、代入されない場合は値がnilとなる点にも注意が必要です。例を見て、もう少しわかりやすく説明すると......。

コピーコード コードは以下の通りです。

class A 
   The class instance variables of class # can be assigned or unassigned before access, unassigned is 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