クラス変数とクラスインスタンス変数の違い
クラス変数
class A
@@class_variable = "Hey!"
end
Code language: Ruby (ruby)
- 全てのサブクラスと共有して値を持つ。
- インスタンスメソッド及びクラスメソッドからアクセスできる。
クラスインスタンス変数
class A
@class_instance_variable = "Hey!"
end
Code language: Ruby (ruby)
見た目はインスタンス変数のようだが、機能としてはクラス変数に近い。
- クラスメソッドからのみアクセスできる。(インスタンスメソッドからはアクセスできない。)
- 継承関係にあるクラスの影響を受けない。(親クラスや子クラスなどの継承関係にあるクラスで代入したとしても、他のクラスでの値に影響を与えない。継承関係にあるクラスから独立して、常にそのクラス独自の値を持つ。)
参考:
インスタンス変数/クラス変数/クラスインスタンス変数 – Qiita
Understanding Class Instance Variables | Codegram Thoughts
Class-level Instance Variables | John W. Long
Initializing class instance variables – Stack Overflow
インスタンス変数とクラスインスタンス変数の違い
Ruby のクラスは Class クラスのインスタンスであり、クラスインスタンス変数は Class クラスのインスタンスのインスタンス変数である。
参考:
クラスインスタンス変数のアクセッサー
class A
@class_instance_variable
class << self
attr_accessor :class_instance_variable
end
def get_class_instance_variable
self.class.class_instance_variable
end
def set_class_instance_variable(value)
self.class.class_instance_variable = value
end
end
Code language: Ruby (ruby)
参考:
クラスインスタンス変数にインスタンスメソッドからアクセスする – Qiita
クラス変数/クラスインスタンス変数を継承して使う
参考:
The Magic of Class-level Instance Variables | AppSignal Blog
モジュールの変数
参考:
module 内で使用しているインスタンス変数を継承先のクラスメソッドで使用したい – teratail
class_variables
クラス変数の一覧を取得する。
ClassName.class_variables
Code language: Ruby (ruby)
参考:
Module#class_variables | Ruby リファレンスマニュアル [公式]
instance_variables
クラスインスタンス変数の一覧を取得する。
ClassName.instance_variables
Code language: Ruby (ruby)
参考:
Object#instance_variables | Ruby リファレンスマニュアル [公式]
instance_variable_get / instance_variable_set
instance_variable_get
あるいは instance_variable_set
を使うとアクセッサーを定義していなくてもクラスインスタンス変数にアクセスできる。
ClassName.instance_variable_set(:@class_instance_variable, "value")
value = ClassName.instance_variable_get(:@class_instance_variable)
Code language: Ruby (ruby)
参考:
クラスインスタンス変数にインスタンスメソッドからアクセス | EasyRamble
Object#instance_variable_get | Ruby リファレンスマニュアル [公式]
Object#instance_variable_set | Ruby リファレンスマニュアル [公式]
class_variable_get / class_variable_set
class_variable_get
あるいは class_variable_set
を使うとアクセッサーを定義していなくてもクラス変数にアクセスできる。
ClassName.class_variable_set(:@@class_variable, "value")
value = ClassName.class_variable_get(:@@class_variable)
Code language: Ruby (ruby)
参考: