クラス変数とクラスインスタンス変数の違い

クラス変数

class A
  @@class_variable = "hoge"
end

全てのサブクラスと共有して値を持つ。

インスタンスメソッド及びクラスメソッドからアクセスできる。

クラスインスタンス変数

class A
  @class_instance_variable = "hoge"
end

見た目はインスタンス変数っぽいが、機能的にはクラス変数に近い。

クラスメソッドからのみアクセスできる。(インスタンスメソッドからはアクセスできない。)

継承の影響を受けない。(スーパークラスやサブクラスなど継承関係にあるクラスで代入しても、他のクラスに影響を与えない。継承関係にあるクラスから独立して常にそのクラス独自の値を持つ。)

参考:

インスタンス変数、クラス変数、クラスインスタンス変数 – Qiita

クラス変数とクラスインスタンス変数 – Qiita

Ruby のクラスインスタンス変数とは? | エンジニアライブログ

変数と定数 (Ruby 2.5.0)

Understanding class instance variables in Ruby | Codegram Thoughts

Class-level instance variables | John W. Long 

Initializing class instance variables in Ruby – Stack Overflow

インスタンス変数とクラスインスタンス変数の違い

Ruby のクラスは Class クラスのインスタンスであり、クラスインスタンス変数は Class クラスのインスタンスのインスタンス変数である。

参考:

クラスインスタンス変数 – Qiita

クラスインスタンス変数のアクセッサー

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

参考:

Ruby でクラスインスタンス変数にインスタンスメソッドからアクセスする – Qiita

クラス変数/クラスインスタンス変数を継承して使う

参考:

Ruby でクラスの属性をうまく継承する – Qiita

The Magic of Class-level Instance Variables | AppSignal Blog

モジュールの変数

参考:

Module 内でクラスインスタンス変数 – Qiita

module 内で使用しているインスタンス変数を、継承先のクラスメソッドで使用したい。| teratail

class_variables

クラス変数の一覧を取得する。

ClassName.class_variables

参考:

instance method Module#class_variables (Ruby 2.5.0)

class_variables (Module) – Rubyリファレンス

instance_variables

クラスインスタンス変数の一覧を取得する。

ClassName.instance_variables

参考:

instance method Object#instance_variables (Ruby 2.6.0)

instance_variable_get / instance_variable_set

instance_variable_get あるいは instance_variable_set を使うとアクセッサーを定義していなくてもクラスインスタンス変数にアクセスできる。

ClassName.instance_variable_set(:@class_instance_variable, "value")
ClassName.instance_variable_get(:@class_instance_variable)

参考:

Ruby でクラスインスタンス変数にインスタンスメソッドからアクセス | EasyRamble

instance method Object#instance_variable_get (Ruby 2.6.0)

instance method Object#instance_variable_set (Ruby 2.6.0)

class_variable_get / class_variable_set

class_variable_get あるいは class_variable_set を使うとアクセッサーを定義していなくてもクラス変数にアクセスできる。

ClassName.class_variable_set(:@@class_variable, "value")
ClassName.class_variable_get(:@@class_variable)

参考:

instance method Module#class_variable_get (Ruby 2.5.0)

instance method Module#class_variable_set (Ruby 2.5.0)

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です