An eine vorhandene Zeichenfolge anhängen

104

Um an eine vorhandene Zeichenfolge anzuhängen, mache ich Folgendes.

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

Gibt es eine bessere Möglichkeit, eine vorhandene Zeichenfolge anzuhängen?

Bevor jemand die folgende Antwort vorschlägt, zeige ich, dass diese nicht funktioniert

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

Im obigen Fall unterscheidet sich object_id in zwei Fällen.

Neeraj Singh
quelle

Antworten:

166

Sie können verwenden <<, um eine Zeichenfolge an Ort und Stelle anzuhängen.

s = "foo"
old_id = s.object_id
s << "bar"
s                      #=> "foobar"
s.object_id == old_id  #=> true
sepp2k
quelle
1
Wie machst du s <<! "bar", wie zum Ändern des Status des Objekts? concat! ("bar") funktioniert nicht ...
xxjjnn
@RainbowPony Wie meine Antwort zeigt, <<ändert sich bereits der Status des Objekts. Das tut es auch concat.
sepp2k
Nicht immer: 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 ist eine Instanz von Widget. Es kann Notizen haben. Nachricht ist attr_accessible.
xxjjnn
1
@ RainbowPony Ja, immer. In Ihrem Fall erhalten Sie die unveränderte Zeichenfolge zurück, da widget.notes.where(:author_id => a).firstvermutlich jedes Mal ein neues Objekt zurückgegeben wird, das eine eigene unabhängige Zeichenfolge hat.
sepp2k
Ah. Ich habe gerade eine neue Frage gestellt stackoverflow.com/questions/13989619/… danke für die Hilfe!
xxjjnn
56

Sie können auch Folgendes verwenden:

s.concat("world")
Ju Nogueira
quelle
4
<<sollte auch verkettbar sein, da es den String zurückgibt.
Scottysseus
In der Tat - und << ist auch kürzer zu schreiben UND sieht ähnlich aus wie die C ++ - Cout-Variante. << ist Schönheit!
Shevy
1
Hinweis: Dadurch wird die ursprüngliche Zeichenfolge geändert. Vorsichtig verwenden.
Damien Roche
3

Kann ich fragen, warum das wichtig ist?

Ich weiß, dass dies keine direkte Antwort auf Ihre Frage ist, aber die Tatsache, dass Sie versuchen, die Objekt-ID einer Zeichenfolge beizubehalten, könnte darauf hindeuten, dass Sie sich erneut ansehen sollten, was Sie tun möchten.

Sie können beispielsweise feststellen, dass das Verlassen auf die Objekt-ID einer Zeichenfolge zu Fehlern führt, die nur schwer aufzuspüren sind.

Shadowfirebird
quelle
4
Vielleicht um Parameter durch Referenz zu ändern? (was wahrscheinlich schlechtes Design in einer vollwertigen oop-Sprache ist)
hurikhan77
4
Oder nur um zu vermeiden, dass zu viele neue Objekte erstellt werden? Das ist völlig vernünftig.
James A. Rosen
1
Wenn Sie eine Zeichenfolge an Ort und Stelle ändern und ein neues Objekt erstellt wird, wird das alte Objekt mit Müll gesammelt. Sollten wir uns wirklich Sorgen um die Anzahl der von uns erstellten String-Objekte machen?
Shadowfirebird
@Shadowfirebird Vielleicht schreibt er eine Methode, die 1000 Mal pro Sekunde aufgerufen wird und seinen Müllsammler nicht mit ein paar Strings festmachen will.
Michael Dorst
2

Noch ein anderer Weg:

s.insert(-1, ' world')
Bharath
quelle
1

Hier ist ein anderer Weg:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
chuckSaldana
quelle