バリケンのRuby日記 RSSフィード

2006-05-22

[] オブジェクトクラスについて  オブジェクトとクラスについて - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  オブジェクトとクラスについて - バリケンのRuby日記  オブジェクトとクラスについて - バリケンのRuby日記 のブックマークコメント

Rubyオブジェクトは、必ず何らかの「クラス」から生成されているよ。そのオブジェクトの生成元のクラスを「所属クラス」と呼ぶよ。

そして一度生成されたオブジェクトは、消滅するまで所属する「クラス」が変わることはないよ。

たとえば文字列(Stringクラス)として生成されたオブジェクトは、消滅するまで所属クラスStringクラスから変わることはないよ。String#to_iを使って

a = '100'
a = a.to_i

と書いた場合、aがStringクラスからFixnumクラスに変化したように見えるかもしれないけど、実は

  1. Stringクラスオブジェクトである"100"に対して、
  2. to_i」というメソッドの実行を依頼すると、
  3. その結果Fixnumクラスオブジェクトが生成され、(つまり100)
  4. そのオブジェクトにaというラベルを貼り付ける("100"に貼られていたラベルを張り替える)
  5. ラベルをはがされた"100"は、ガーベージコレクションによってメモリから消滅する

という動作をしているよ。

イメージとしては、次のようになるよ。

a = '100'

f:id:muscovyduck:20060522144328p:image

a = a.to_i

f:id:muscovyduck:20060522144327p:image

あと、Stringクラスから生成されたオブジェクトのことを「Stringクラスインスタンス」と呼ぶみたいだよ。「インスタンスとは、オブジェクトのこと」という理解で、たぶん大丈夫だと思うよ。

メソッドの戻り値として生成されたオブジェクトや、リテラルとしてオブジェクトを生成した場合、生成元のクラス名がわからないときがあるよね。そういうときは、Object#classメソッドで調べることが出来るよ。たとえば次のように書くと、

a = 'Hello, world!'
puts a.class
a = 123
puts a.class
a = [ 1, 2, 3 ]
puts a.class
a = /abc123/
puts a.class
a = { 'a' => 1, 'b' => 2, 'c' => 3 }
puts a.class
a = :helloworld
puts a.class
a = a.class
puts a.class

実行結果は次のようになるよ。

String
Fixnum
Array
Regexp
Hash
Symbol
Class