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.

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

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")

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.


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


1

Hier ist ein anderer Weg:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.