0

この Ruby 1.9.2 コードでは:

class ExampleClass
  def self.string_expander(str)
    -> do
      p "start of Proc.  str.object_id is #{str.object_id}"
      str *= 2
      p "end of Proc.    str.object_id is #{str.object_id}"
    end
  end
end

string = 'cat'                              # => "cat"
p "string.object_id is #{string.object_id}" # => "string.object_id is 70239371964380"
proc = ExampleClass.string_expander(string) # => #<Proc:0x007fc3c1a32050@(irb):3 (lambda)>
proc.call
                                            # "start of Proc.  str.object_id is 70239371964380"
                                            # "end of Proc.    str.object_id is 70239372015840"
                                            # => "end of Proc. str.object_id is 70239372015840"

to が最初にProc呼び出されstrたときはProc、元のオブジェクトの参照が開始されますが、str *= 2操作の実行後に別のオブジェクトが参照されます。何故ですか?元の文字列が変更され、 がProcそれを参照し続けると予想していました。

4

1 に答える 1

2

割り当てる場合:

str = "abc"

strオブジェクト ID を取得します。これを行った場合:

str[1] = 'd'

str次に、既存の文字列を変更しているため、のオブジェクト ID は変更されません。

ただし、次のいずれかを行う場合:

str = "123"
str = str * 2
str *= 2

に新しい文字列を作成/割り当てているstrため、オブジェクト ID が変更されています。

于 2013-08-31T16:28:56.177 に答える