2013-04-26 15 views
7

Może ktoś wyjaśnić zachowaniePrzypisanie ciągu za pomocą odnośnika/kopii?

Scenariusz-1

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

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

Tutaj, zmieniając wartość str1 nie ma wpływu na wartość str.

Scenariusz-2

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

shoudn't efekt gsub! tylko str1? Dlaczego zmienia się str? Jeśli str1 po prostu zawiera odniesienie do str, dlaczego ta wartość nie uległa zmianie w Scenariuszu-1?

Odpowiedz

16

patrz poniżej dokładnie:

Scenariusz-1

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

W powyższym przypadku str i str1 gospodarstwa odniesienie do tego samego obiektu, który świadczy object_id. Teraz używasz lokalnej zmiennej str1 w poniższym przypadku, aby pomieścić nowy obiekt "hi", który jest również udowodniony przez dwa różne object_id s.

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

Scenariusz-2

`String#gsub! mówi:

Wykonuje podstawienia String # gsub w miejscu, wracając str, lub zero jeśli nie przeprowadzono podstawienia. Jeśli nie zostanie podany blok i żadna wymiana, zamiast tego zostanie zwrócony moduł wyliczający.

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

Bicie mnie do tego ... +1 – Salil

+1

Dobrze napisana odpowiedź. –

+0

Czy to prawda wszystko? Wszystko jest przedmiotem i wszystko jest przypisane przez odniesienie? W tym inne rzeczy, które zwykle są prymitywami w innych językach, takich jak liczby całkowite lub zmiennoprzecinkowe? –

0

W zmiennej zadania, to nie ma znaczenia, czy istnieje zmienna o tej samej nazwie, a jeśli tak, to jaką wartość to było. W scenariuszu-1 ostatecznie przypisano str1 = "hi", a cokolwiek się z nim stało, nie ma to znaczenia. Scenariusz-1 jest taki sam jak następujący bez str1 = str.

str = "hello" 
str1 = "hi" 

W Scenariuszu-2, str i str odnoszą się do tego samego łańcucha. Jeśli zmienisz to za pomocą jednej ze zmiennych wskazujących na ten ciąg, to gdy wywołasz go za pomocą drugiej zmiennej, odnosi się do tego samego zmienionego ciągu.

Powiązane problemy