インスタンス変数や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クラスオブジェクトのインスタンス変数を指す。