Rubyにおけるインスタンス変数 クラス変数 クラスインスタンス変数(Instance variables, class variables and class instance variables in ruby)

(English follows)

Rubyにおけるインスタンス変数 クラス変数 クラスインスタンス変数に関するメモ。以下の記事に対するコメントを含んでいる。

includeとextendの違いについて - shoutm's diary

結論は以下の通り。

  • インスタンス変数はオブジェクトに属する
  • クラス変数はクラス階層に属する
  • クラスインスタンス変数は該当クラス(モジュール)のみに属する。
module MyModule
  @@class_val = 2;
  @classinstance_val = 3;

  def mod_func1
    @instance_val = 1;
  end

  def self.mod_func2
    puts @classinstance_val # => 3
  end
end


class MyClass
  include MyModule

  def func1
    mod_func1
    puts @instance_val      # => 1
  end

  def self.func2
    puts @@class_val        # => 2
  end

  def self.func3
    puts @classinstance_val # => nil
  end
end

print 'instance variable = '
a = MyClass.new
a.func1

print 'class variable = '
MyClass.func2

print 'class instance variable = '
MyModule.mod_func2

print 'class instance variable from MyClass = '
MyClass.func3

出力結果は以下の通り。

instance variable = 1
class variable = 2
class instance variable = 3
class instance variable from MyClass = 

特にMyModuleをincludeしたMyClassにおいて、ポイントは以下の通り。

  • MyModuleのクラス変数はMyClassで引き継がれる。(includeしたモジュールがクラス階層に含まれる。)
  • self.func3の時点でselfはMyClassであるため、MyModuleのクラスインスタンス変数は見えない。

==============================

My note for instance variables, class variables and instance class variables of ruby. This also refers to my past blog post:

includeとextendの違いについて - shoutm's diary

In conclusion, we can say as below:

  • Instance variables belongs to an object.
  • Class variables belongs to a class hierarchy.
  • Class instance variables belongs to a class itself.

(See sample code and output results above.)

Especially there are two points with regards to MyClass which includes MyModule.

  • Class variables in MyModule are inherited to MyClass.
  • self(current class) is MyClass at the point of 'self.func3', MyClass can't see the class instance variables in MyModule.