読者です 読者をやめる 読者になる 読者になる

まりぴよこのブログ

日々の日記。技術ネタでまとまりきってないものの記録、伝わる文章の書き方を練習とか。

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を持つ・・に合致しないルールなんだが・・・

d.hatena.ne.jp

多くのオブジェクトはアロケートされた空間を示しますが、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 (オブジェクトをコピーするときに呼ばれる)を定義すること

ref.xaio.jp

明日は配列だな〜♪