2013-08-31 75 views
0

在這個紅寶石1.9.2代碼:爲什麼這個Proc的變量引用的對象改變了?

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:[email protected](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" 

的第一次Proc被調用時,strProc內開始了引用原始對象,但隨後,該str *= 2操作運行後,引用另一個對象。這是爲什麼?我預計原來的字符串會被修改,Proc會繼續引用它。

+1

'str * = 2'將一個新的字符串賦值給'str'(與'str = str * 2'相同),所以它得到一個新的對象id。 – lurker

回答

2

當分配:

str = "abc" 

str獲取對象ID。如果你這樣做:

str[1] = 'd' 

隨後的str對象ID不會因爲要修改現有的字符串改變。

不過,如果你做這些:

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

您正在創建/分配一個新的字符串str,所以它的對象ID的變化。

相關問題