Ruby Koans で学ぶ Object
Objectについて学ぶ about_object.rb
- 全てがObject(他言語でのプリミティブ型みたいなのはない)
- 数値もObject
- nilもObject
- Objectはobject_idを持つ(Fixnum)
- newされたそれぞれのインスタンスは、全て違うobject_idを持つ
Fixnumのobject_id
irb > 1.object_id => 3 irb > 2.object_id => 5 irb > 1.object_id => 3
こんな感じで、Fixnumの場合固定のobject_idを持つらしい。
幾つか試した結果、Fixnumのobject_idの求め方は
n.object_id ==> n * 2 + 1
になっている。
全てはObject, FixnumもObject, 全てのObjectをnewしたインスタンスは別々のobject_idを持つ・・に合致しないルールなんだが・・・
多くのオブジェクトはアロケートされた空間を示しますが、Fixnumのためにメモリを確保するのは効率が悪いので、下位1bitが1の時は番地ではなく、整数そのものとして扱うことにしています。Fixnumであることを示すフラグに1bit使ってしまったので、Fixnumは63bit符号つき整数の範囲となりました。なお、32bitマシンでは31bit符号つき整数となります。
ふむふむ。。なるほど。。。
Object.clone
- cloneすると新しいinstanceが生成される
- 新しいインスタンスなので、clone元とobject_idは一致しない
- object_idの違うインスタンス同士を演算子で比較すると一致しない(!=)
- cloneはsharrow copy(インスタンス変数の参照先までdeep copyしたい場合は、自分でcloneを定義するか、initialize_copy (オブジェクトをコピーするときに呼ばれる)を定義すること
明日は配列だな〜♪