インスタンス変数やselfの理解整理

あいまいな理解だったので確認してみた。

  1 #!/usr/local/bin/ruby
  2 class Hoge
  3   p self
  4   p ancestors
  5   @instantce_var1 = "A"
  6   def initialize(a=self,b=Time.now)
  7     @instantce_var1 = "B"
  8     @instantce_var2 = "C"
  9     p a
 10     p self
 11     puts b
 12   end
 13   def check
 14     p @instantce_var1
 15     p @instantce_var2
 16     p self
 17   end
 18
 19   def self.check
 20     p @instantce_var1
 21     p @instantce_var2
 22     p self
 23   end
 24 end
 25
 26 puts "start at #{Time.now}"
 27 sleep 1
 28 puts "#{__LINE__}----"
 29 hoge = Hoge.new
 30 puts "#{__LINE__}----"
 31 hoge.check
 32 puts "#{__LINE__}----"
 33 Hoge.check
 34 puts "#{__LINE__}----"
 35 p hoge.instance_variable_get(:@instantce_var1)
 36 p hoge.instance_variable_get(:@instantce_var2)
 37 puts "#{__LINE__}----"
 38 p Hoge.instance_variable_get(:@instantce_var1)
 39 p Hoge.instance_variable_get(:@instantce_var2)
 40 puts "#{__LINE__}----"
 41 p hoge.class.ancestors
  • 実行結果
  1 Hoge
  2 [Hoge, Object, Kernel]
  3 start at Sun May 24 22:04:13 +0900 2009
  4 28----
  5 #<Hoge:0xb802c688 @instantce_var1="B", @instantce_var2="C">
  6 #<Hoge:0xb802c688 @instantce_var1="B", @instantce_var2="C">
  7 Sun May 24 22:04:14 +0900 2009
  8 30----
  9 "B"
 10 "C"
 11 #<Hoge:0xb802c688 @instantce_var1="B", @instantce_var2="C">
 12 32----
 13 "A"
 14 nil
 15 Hoge
 16 34----
 17 "B"
 18 "C"
 19 37----
 20 "A"
 21 nil
 22 40----
 23 [Hoge, Object, Kernel]
  • 解説
行数 解説 実行結果の行数
3 クラス定義の中で、メソッド定義の外ではselfはクラスそのもの(ここではHoge)を指す。 1
4 継承した祖先の配列 2
5 メソッド定義の外でインスタンス変数を定義
6 ここでのselfはなにか?またbに代入するTime.nowはいつ評価されるか?
19 Hoge.checkメソッドの定義。このメソッド定義の中の@instance_varNは何を指す?selfは?
26 Sun May 24 22:04:13 +0900 2009に開始 3
27 一秒sleep
29 9行目と10行目の結果が同じなので、6行目のa=selfのselfは作成されたHogeインスタンス(=object)を指す。また、b=Time.nowが実行されるのはmethodが呼ばれた時。実行結果の3行目の時間から1秒後なので。定義時に代入される訳ではない、という事。 5-7
31 13-17行目のmethod call。これはいつものやつ。 9-11
33 19-23行目のmethod call。@instance_var2はnil。※インスタンス変数の初期値はnil 13-15
35-36 hogeインスタンス変数をget 17-18
38-39 Hogeインスタンス変数をget。@instance_var2はnil 20-21
41 hogeオブジェクトが所属するクラスの継承関係(4行目と同じ) 23

理解に引っかかりやすいのは、5行目で定義される@instance_var1はHogeに属すると言うこと。
Hogeもまた、Classクラスのインスタンスなのでインスタンス変数を持つ。
これをHogeクラスオブジェクトのインスタンス変数、と言ったりする。
Hogeオブジェクトのインスタンス変数、という言い方と区別すること。
もう一点。self.checkのようなクラスメソッド定義内では、selfはクラスオブジェクト(=Hoge)を指す。
同じ理由で@で参照するインスタンス変数はHogeクラスオブジェクトのインスタンス変数を指す。