クラス変数とは
クラス変数とはクラスで定義する変数である。クラス変数はクラスメソッド内とクラス定義内、またはそのサブクラスがアクセスでき共有される。
定義方法
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