私はこのRubyコードを持っています:
var1 = 10
puts var1.object_id
var1 = var1 + 0
puts var1.object_id
var1 = var1 + 1
puts var1.object_id
出力は次のとおりです。
1> 21
2> 21
3> 23
質問: なぜ Ruby はゼロ以外の値を追加するときに新しいオブジェクトを作成し、0 を追加するときは作成しないのですか?
内部的には、Ruby¹ は Fixnum を操作するときにオブジェクトをまったく作成しません。代わりに、実装は「タグ付き」ポインターを使用します。つまり、ポインターの最下位ビットが設定されている場合、Ruby は、このポインターが実際にはオブジェクトを指すのではなく、Fixnum の値を直接エンコードすることを理解します。したがって、同じ数値を持つ Fixnum は、常に同じポインター値で表されます。
¹ これは、公式の Ruby インタープリターを意味します。他の実装では、これを別の方法で処理する場合があります。
Ruby ではFixnum
、 、true,
false
、nil
およびSymbol
に事前定義されたがありobject_id
ます。
1.object_id #=> 3
2.object_id #=> 5
小さな整数0
に加算しても値は変わらないためobject_id
、同じままです。
ただし、s に対して同じ演算を実行するとBignum
、異なるobject_id
s が得られます。
a = 1073741824
puts a.object_id # => 7658076
b = a + 0
puts b # => 1073741824
puts b.object_id # => 7287012
Ruby にはあらかじめ定義されたオブジェクトがあります
irb(main):001:0> 10.object_id
=> 21
irb(main):002:0> 11.object_id
=> 23
それはいくつかの自然数であり、それ以上です
irb(main):003:0> true.object_id
=> 2
irb(main):004:0> false.object_id
=> 0
irb(main):005:0> nil.object_id
=> 4
irb(main):006:0> 0.object_id
=> 1
irb(main):007:0> -2.object_id
=> -3
これらのIDは変更されません
そうではありません。10
および11
は Fixnum です。整数値ごとに 1 つの Fixnum インスタンスしかない10
ため、object_id と object_id11
があります。それがあなたが見ているものです。