2013-04-26 32 views
7

誰能解釋通過參考/複製字符串分配?

方案-1

str = "hello" 
str1 = str 
puts str #=> hello 
puts str1 #=> hello 

str1 = "hi" 
puts str1 #=> hi 
puts str #=> hello 

這裏,改變str1值對的str的價值沒有影響的行爲。

方案-2

str = "hello" 
str1 = str 
str1.gsub! "hello", "whoa!" 
puts str1 #=> whoa 
puts str #=> whoa 

Shoudn't的gsub!效果僅str1?爲什麼它改變str?如果str1僅保留對str的引用,那麼爲什麼方案-1中的值沒有更改?

回答

16

查找下面仔細:

方案-1

str = "hello" 
str1 = str 
puts str #=> hello 
puts str1 #=> hello 
p str.object_id #=>15852348 
p str1.object_id #=> 15852348 

在上述情況下strstr1保持參考其由object_id證明相同的對象。現在在下例中使用局部變量str1來保存新對象"hi",這也由兩個不同的object_id證明。

str1 = "hi" 
puts str1 #=> hi 
puts str #=> hello 
p str.object_id #=> 15852348 
p str1.object_id #=> 15852300 

方案-2

`String#gsub!說:

執行字符串#GSUB的替代到位,返回海峽,或者進行零沒有換人。如果沒有給出塊並且沒有替換,則返回一個枚舉器。

str = "hello" 
str1 = str 
str1.gsub! "hello", "whoa!" 
puts str1 #=> whoa 
puts str #=> whoa 
p str.object_id #=>16245792 
p str1.object_id #=>16245792 
+1

你打我吧.... +1 – Salil 2013-04-26 06:48:36

+1

寫得很好的答案。 – 2013-05-08 07:24:18

+0

這對一切都適用嗎?一切都是一個對象,一切都是通過引用分配的?包括其他語言中通常爲其他語言的東西,例如整數或浮點數? – 2014-11-14 19:04:40

0

在變量賦值,它沒有任何效果是否存在具有相同名稱的變量,如果是這樣,那是什麼樣的價值。在場景-1中,str最終被指定爲str1 = "hi",並且在此之前發生的任何事情都是無關緊要的。情景-1與以下相同,沒有str1 = str

str = "hello" 
str1 = "hi" 

在情形-2,strstr指的是相同的字符串。如果通過其中一個指向該字符串的變量來更改該變量,那麼當您通過其他變量調用該變量時,它會引用相同的更改字符串。