0

dup以下はテストケースです。私はメソッドで何かをしようとしていました。しかし、私はこの奇妙な振る舞いに気づきました。合理的な説明が見つかりませんでした。

class ObjectIdTest
  attr_accessor :x, :y
  def initialize
    @x, @y = 1, 2
  end

  def object_ids
    "x:#{@x.object_id}, y: #{@y.object_id}"
  end
end

class ObjectIdTestChild < ObjectIdTest
  attr_accessor :z
  def initialize
    @z = 3
  end

  def object_ids
    super + " z: #{@z.object_id}"
  end
end

oid1 = ObjectIdTest.new
oid2 = ObjectIdTestChild.new
p oid2.object_ids

oid3 = oid2.dup
p oid3.object_ids

出力: "x:4、y:4 z:7"

「x:4、y:4 z:7」

  1. 通常、オブジェクトIDは長くなります(70322728590900など)。なぜこれらは非常に小さいのでしょうか。(彼らは親戚ですか、それともそのようなものですか?)
  2. x 'sとy 'sのオブジェクトIDが同じなのはなぜですか?
  3. oid2oid3のインスタンス変数が同じオブジェクトIDを持つのはなぜですか?
4

1 に答える 1

1

1 - Fixnumber 以外のオブジェクトはより大きな値を持ちます。例えば:

 "hello".object_id #=> 70256148388440
 0x3FFFFFFFF.object_id #=> 34359738367

2 および 3 -dupオブジェクトの浅いコピーを生成しますが、この場合、そのオブジェクトはたまたま同じ Fixnum を表します。Fixnums を使用すると、同じ番号は常に同じ object_id になります。 ルビーオブジェクト

于 2013-02-23T21:34:38.060 に答える