3

私はこの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 を追加するときは作成しないのですか?

4

4 に答える 4

9

内部的には、Ruby¹ は Fixnum を操作するときにオブジェクトをまったく作成しません。代わりに、実装は「タグ付き」ポインターを使用します。つまり、ポインターの最下位ビットが設定されている場合、Ruby は、このポインターが実際にはオブジェクトを指すのではなく、Fixnum の値を直接エンコードすることを理解します。したがって、同じ数値を持つ Fixnum は、常に同じポインター値で表されます。

¹ これは、公式の Ruby インタープリターを意味します。他の実装では、これを別の方法で処理する場合があります。

于 2012-12-27T21:40:36.653 に答える
5

Ruby ではFixnum、 、true, falsenilおよびSymbolに事前定義されたがありobject_idます。

1.object_id #=> 3
2.object_id #=> 5

小さな整数0に加算しても値は変わらないためobject_id、同じままです。

ただし、s に対して同じ演算を実行するとBignum、異なるobject_ids が得られます。

a = 1073741824
puts a.object_id # => 7658076
b = a + 0
puts b # => 1073741824
puts b.object_id # => 7287012
于 2012-12-27T21:44:50.623 に答える
2

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は変更されません

于 2012-12-27T21:40:02.627 に答える
2

そうではありません。10および11は Fixnum です。整数値ごとに 1 つの Fixnum インスタンスしかない10ため、object_id と object_id11があります。それがあなたが見ているものです。

于 2012-12-27T21:39:19.440 に答える