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

クラス変数
class A
    @@class_variable = "Hey!"
endCode language: Ruby (ruby)
  • 全てのサブクラスと共有して値を持つ。
  • インスタンスメソッド及びクラスメソッドからアクセスできる。
クラスインスタンス変数
class A
    @class_instance_variable = "Hey!"
endCode language: Ruby (ruby)

見た目はインスタンス変数のようだが、機能としてはクラス変数に近い。

  • クラスメソッドからのみアクセスできる。(インスタンスメソッドからはアクセスできない。)
  • 継承関係にあるクラスの影響を受けない。(親クラスや子クラスなどの継承関係にあるクラスで代入したとしても、他のクラスでの値に影響を与えない。継承関係にあるクラスから独立して、常にそのクラス独自の値を持つ。)

参考:

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

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

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

変数と定数 | Ruby リファレンスマニュアル [公式]

Understanding Class Instance Variables | Codegram Thoughts

Class-level Instance Variables | John W. Long 

Initializing class instance variables – 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
endCode language: Ruby (ruby)

参考:

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

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

参考:

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

The Magic of Class-level Instance Variables | AppSignal Blog

モジュールの変数

参考:

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

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

class_variables

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

ClassName.class_variablesCode language: Ruby (ruby)

参考:

Module#class_variables | Ruby リファレンスマニュアル [公式]

instance_variables

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

ClassName.instance_variablesCode 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)

参考:

Module#class_variable_get | Ruby リファレンスマニュアル [公式]

Module#class_variable_set | Ruby リファレンスマニュアル [公式]

記事をシェアする:
タグ:

コメントを残す

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

Protected by reCAPTCHA