この 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
それを参照し続けると予想していました。