Ruby のほとんどのオブジェクトでは、取得する数値#object_id
は、実際にはオブジェクトの内部 C データ構造へのポインターです。このデータ構造には、Ruby の実装/ビルドが使用するメモリ アロケータによって割り当てられた領域があります。
コードを読まなくても、Linux バージョンは毎回異なる結果を生成していると推測できます。これは、Ruby または C アロケーターのいずれかが、意図的に割り当てまたはポインターにランダムなオフセットを使用して、それらを推測しにくくし、プログラムをより複雑にしているためです。安全。
について ruby が保証することは 1 つだけですobject_id
: 特定のオブジェクトが存在する限り、そのオブジェクトはそのobject_id
ruby インタープリターに固有のものであり、変更されません。それで全部です。object_id
同じメモリ チャンクを取得することになる場合は、以前に作成され、後でガベージ コレクションされたオブジェクトと同じものを取得することもできます。
また、次のようなことを行う場合は注意してください。
irb(main):001:0> a = "hi"
=> "hi"
irb(main):002:0> a.object_id
=> 14348380
irb(main):003:0> a = a + " there"
=> "hi there"
irb(main):004:0> a.object_id
=> 14197020
この行a = a + " there"
は実際には new を使用して新しいオブジェクトを作成しますが、object_id
usingはそうで#concat
はありません:
irb(main):005:0> a = "hi"
=> "hi"
irb(main):006:0> a.object_id
=> 12031400
irb(main):007:0> a.concat " there"
=> "hi there"
irb(main):008:0> a.object_id
=> 12031400
また、Ruby では、代入は代入された変数をオブジェクトにバインドするため、ある変数を別の変数に代入すると、両方が同じオブジェクトを指すことに注意してください。
irb(main):011:0> a = "hi"
=> "hi"
irb(main):012:0> a.object_id
=> 12081640
irb(main):013:0> b = a
=> "hi"
irb(main):014:0> b.object_id
=> 12081640
したがって、1 つの変数を変更すると、もう 1 つの変数が変更されます。
irb(main):015:0> a.concat " there"
=> "hi there"
irb(main):016:0> b
=> "hi there"