2013-04-26 8 views
7

Kann jemand das VerhaltenString-Zuweisung nach Referenz/Kopie?

Szenario-1

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

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

Hier Ändern Sie den Wert von str1 hat keinen Einfluss auf den Wert der str erklären.

Szenario-2

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

shoudn't die gsub! Wirkung nur die str1? Warum ändert sich str? Wenn str1 nur den Verweis auf str enthält, warum hat sich dann der Wert in Szenario-1 nicht geändert?

Antwort

16

Schauen Sie unten sorgfältig:

Szenario-1

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

Im obigen Fall str und str1 den Verweis auf das gleiche Objekt halten, die durch die object_id bewiesen. Jetzt verwenden Sie die lokale Variable str1 im folgenden Fall, um ein neues Objekt "hi" zu halten, was auch durch die zwei verschiedenen object_id s bewiesen wird.

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

Szenario-2

`String#gsub! sagt:

Führt die Ersetzungen von String # gsub in Ort, str Rückkehr oder null, wenn keine Ersetzungen durchgeführt wurden. Wenn kein Block und kein Ersatz angegeben wird, wird stattdessen ein Enumerator zurückgegeben.

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

Sie sind Beat mich dazu .... +1 – Salil

+1

Gut geschriebene Antwort. –

+0

Gilt das für alles? Alles ist ein Objekt und alles wird durch Referenz zugeordnet? Einschließlich anderer Dinge, die normalerweise in anderen Sprachen wie Integers oder Floats primitiv sind? –

0

In Variablenzuweisung, hat es keine Auswirkung, ob eine Variable mit dem gleichen Namen gab, und wenn ja, welchen Wert es war. In Szenario 1 wird str schließlich str1 = "hi" zugewiesen, und was auch immer vorher passiert ist, ist irrelevant. Szenario 1 ist das gleiche wie das Folgende ohne str1 = str.

str = "hello" 
str1 = "hi" 

In Szenario-2, str und str auf die gleiche Zeichenfolge beziehen. Wenn Sie dies über eine der Variablen ändern, die auf diese Zeichenfolge verweisen, wird beim Aufruf über die andere Variable auf dieselbe geänderte Zeichenfolge verwiesen.

Verwandte Themen