2014-04-18 12 views
6

Sto lavorando attraverso un tutorial in questo momento, e mi piacerebbe capire perché si verifica quanto segue:Perché `<<` `si aggiunge a una stringa di Ruby mentre` + = `no?

original_string = "Hello, " 
hi = original_string 
there = "World" 
hi += there 
assert_equal "Hello, ", original_string 

original_string = "Hello, " 
hi = original_string 
there = "World" 
hi << there 
assert_equal "Hello, World", original_string 

Perché += non hanno alcun effetto sulla original_string, e << fa? Ero assolutamente certo che anche il secondo caso sarebbe uguale allo "Hello, ", ma non è così.

hi = original string nel primo esempio sembra copiare il valore di original_string in hi, ma hi = original string nel secondo esempio che consente di impostare hi puntare alla stessa stringa original string. Immagino che dietro le quinte ci sia una sorta di decisione implicita su come copiare il valore o copiare il riferimento ... o qualcosa del genere.

risposta

3

<< su stringa muta l'oggetto originale mentre += crea una copia e restituisce quello.

Vedi l'object_id dei rispettivi stringhe di seguito:

2.1.1 :029 > original_string = "Hello, " 
=> "Hello, " 
2.1.1 :030 > hi = original_string 
=> "Hello, " 
2.1.1 :031 > there = "World" 
=> "World" 
2.1.1 :032 > original_string.object_id 
=> 70242326713680 
2.1.1 :033 > hi.object_id 
=> 70242326713680 

2.1.1 :034 > hi += there 
=> "Hello, World" 
2.1.1 :035 > hi.object_id 
=> 70242325614780 

nota la diversa object_id on hi on line 35. Una volta che si ripristinano hi per original_string nel tuo esempio sopra, e utilizzare <<, esso modifica lo stesso oggetto .

3

In entrambi gli esempi, hi = original_string copia il riferimento.

Con +=, tuttavia, si riassegna lo hi in modo che punti a una nuova stringa, anche se il nome della variabile è lo stesso.

Questo perché hi += there si espande nell'interprete all'espressione hi = hi + there.

Prima di questa operazione, hi e original string condividere un riferimento allo stesso oggetto stringa. Dopo l'operazione = nell'espressione espansa, hi fa ora riferimento al risultato di stringa appena creato di hi + there.

Nell'espressione hi << there, non succede nulla per cambiare a quale oggetto si riferisce hi. Si riferisce alla stessa stringa di original_string e pertanto sia hi sia original_string riflettono la modifica (che è ovviamente dovuta al fatto che entrambi fanno riferimento allo stesso oggetto stringa).

Problemi correlati