100.object_id と 100.object_id は同じか? Rubyにおける比較方法

Ruby

「100.object_id と 100.object_id は同じですか?」という質問は、Rubyでのオブジェクトの識別子に関連するものです。この質問に対する答えを理解するには、RubyのオブジェクトIDの仕組みを知ることが重要です。この記事では、RubyにおけるオブジェクトIDとは何か、そして同じ値のオブジェクトに対してobject_idメソッドがどのように動作するかを解説します。

Rubyのobject_idとは?

Rubyにおける「object_id」は、各オブジェクトを一意に識別するための番号です。object_idメソッドは、オブジェクトのメモリアドレスに基づいてユニークなIDを生成し、そのオブジェクトがメモリ上でどこに格納されているかを示します。

通常、異なるオブジェクトは異なるobject_idを持ちますが、同じオブジェクトを指し示す参照が複数存在する場合、それらは同じobject_idを持ちます。

100.object_id と 100.object_id の違い

質問にある「100.object_id と 100.object_id は同じですか?」というケースについて、Rubyではこれらは同じオブジェクトを指している場合があります。Rubyの整数は「イミュータブルオブジェクト」として扱われ、整数リテラル100は同じオブジェクトIDを共有します。

例えば、次のコードを実行すると、同じobject_idが表示されるはずです。

a = 100b = 100puts a.object_id == b.object_id  # => true

ここでの「a」および「b」は異なる変数ですが、Rubyが最適化により同じ整数オブジェクトを再利用しているため、object_idは一致します。

イミュータブルオブジェクトとmutableオブジェクトの違い

この動作は「イミュータブルオブジェクト」に特有のものです。イミュータブルオブジェクトとは、一度作成されたオブジェクトの内容が変更できないオブジェクトのことです。整数(Integer)やシンボル(Symbol)はこのカテゴリに含まれます。

一方、可変オブジェクト(mutableオブジェクト)である配列(Array)やハッシュ(Hash)などは、同じ値を持っていても異なるobject_idを持つことがあります。例えば、次のコードを実行すると異なるobject_idが表示されます。

a = [1, 2, 3]b = [1, 2, 3]puts a.object_id == b.object_id  # => false

まとめ

「100.object_id と 100.object_id は同じですか?」という質問に関して、Rubyの整数オブジェクト(イミュータブルオブジェクト)は同じ値を持つ場合でも同じobject_idを共有します。しかし、可変オブジェクトに関しては、異なる参照が異なるobject_idを持つことがあるため、必ずしも同じobject_idになるわけではありません。

コメント

タイトルとURLをコピーしました