Aggiunta a una stringa esistente


104

Per aggiungere a una stringa esistente questo è ciò che sto facendo.

s = 'hello'
s.gsub!(/$/, ' world');

C'è un modo migliore per aggiungere a una stringa esistente.

Prima che qualcuno suggerisca di seguire la risposta, fammi vedere che questa non funziona

s = 'hello'
s.object_id
s = s + ' world'
s.object_id 

Nel caso precedente object_id sarà diverso per due casi.

Risposte:


166

È possibile utilizzare <<per aggiungere a una stringa sul posto.

s = "foo"
old_id = s.object_id
s << "bar"
s                      #=> "foobar"
s.object_id == old_id  #=> true

1
Come si fa a <<! "bar", come modificare lo stato dell'oggetto? concat! ("bar") non funziona ...
xxjjnn

@RainbowPony Come mostra la mia risposta, <<modifica già lo stato dell'oggetto. Così fa concat.
sepp2k

Non sempre: irb (main): 038: 0> widget.notes.where (: author_id => a) .first.message.concat ("Potato") => "Y halo thar! = DPotato" irb (main): 039: 0> widget.notes.where (: author_id => a) .first.message => "Y halo thar! = D" # widget è un'istanza di Widget. Può avere note. il messaggio è attr_accessible.
xxjjnn

1
@RainbowPony Sì, sempre. Nel tuo caso si recupera la stringa invariata perché widget.notes.where(:author_id => a).firstpresumibilmente ogni volta restituisce un nuovo oggetto, che avrà una propria stringa indipendente.
sepp2k

Ah. Ho appena fatto una nuova domanda stackoverflow.com/questions/13989619/… grazie per l'aiuto!
xxjjnn

56

puoi anche usare quanto segue:

s.concat("world")

4
<<dovrebbe essere concatenabile, poiché restituisce la stringa.
scottysseus

In effetti, e << è anche più breve da scrivere AND è simile alla variante C ++ cout. << è bellezza!
Shevy

1
Nota: questo modifica la stringa originale. Usa con attenzione.
Damien Roche

3

Posso chiederti perché è importante?

So che questa non è una risposta diretta alla tua domanda, ma il fatto che stai cercando di preservare l'ID oggetto di una stringa potrebbe indicare che dovresti esaminare di nuovo ciò che stai cercando di fare.

Potresti scoprire, ad esempio, che fare affidamento sull'ID oggetto di una stringa porterà a bug che sono piuttosto difficili da rintracciare.


4
Forse per modificare i parametri per riferimento? (che è probabilmente un cattivo design in un vero e proprio linguaggio oop)
hurikhan77

4
O semplicemente per evitare di creare troppi nuovi oggetti? È perfettamente ragionevole.
James A. Rosen

1
Sicuramente se modifichi una stringa in posizione e viene creato un nuovo oggetto, il vecchio oggetto viene raccolto dalla spazzatura? Dovremmo davvero preoccuparci del numero di oggetti String che creiamo?
Shadowfirebird

@Shadowfirebird Forse sta scrivendo un metodo che viene chiamato migliaia di volte al secondo e non vuole impantanare il suo garbage collector con un mucchio di stringhe.
Michael Dorst


1

Ecco un altro modo:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.