LoginSignup
22
21

クラス変数とクラスインスタンス変数を理解する

Last updated at Posted at 2018-01-14

クラス変数とは

クラス変数とはクラスで定義する変数である。クラス変数はクラスメソッド内とクラス定義内、またはそのサブクラスがアクセスでき共有される。

定義方法

class A
  # @@プレフィックスを使用
  @@value = 1
  def self.value; @@value; end
end

クラス変数と継承

クラスAが変数@@valueを定義する場合、そのすべてのサブクラスが@@valueを使える。これは継承のように見えるが、実際は違う。どこかのサブクラスがクラス変数@@valueに値を代入すると、クラス変数のプライベートコピーは作成されず、スーパークラスから見える値がすべて変更される。

class A
  @@value = 1  
  def self.value
    @@value
  end  
end  
A.value # 1

class B < A
  @@value = 2
end
A.value # 2
B.value # 2

class C < A
  @@value = 3
end
# すべての値が変わる
A.value # 3
B.value # 3
C.value # 3

クラスインスタンス変数とは

Rubyにおいてクラスもオブジェクトである。そのため他のオブジェクトと同じようにインスタンス変数を持つことができ、それをクラスインスタンス変数と呼ぶ。クラスインスタンス変数とインスタンス変数でプレフィックス記号に違いがないため、インスタンスメソッド内では使用できない。

定義方法

class A
  # @プレフィックスを使用
  @value = 1
  def self.value; @value; end
end

クラスインスタンス変数と継承

クラスインスタンス変数は、Classオブジェクトのインスタンス変数にすぎない。
AクラスはClassのインスタンスであり、Aクラスを継承したBクラスもまたClassのインスタンスである。クラスが継承関係であろうと、それぞれのAクラス,Bクラスのクラスインスタンス変数は、何も関係ない。それぞれで違う値をセットしても他には影響がない。

class A
  @value = 1  
  def self.value
    @value
  end  
end  
A.value

class B < A
  @value = 2
end
A.value
B.value

class C < A
  @value = 3
end
# 値を変更しても影響を受けていない。
A.value # 1
B.value # 2
C.value # 3
22
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
21