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.