Ich suche nach einer eleganteren Möglichkeit, Zeichenfolgen in Ruby zu verketten.
Ich habe die folgende Zeile:
source = "#{ROOT_DIR}/" << project << "/App.config"
Gibt es eine schönere Möglichkeit, dies zu tun?
Und was ist der Unterschied zwischen <<
und +
?
ruby
string-concatenation
dagda1
quelle
quelle
Antworten:
Sie können dies auf verschiedene Arten tun:
<<
, ist das aber nicht der übliche WegMit String-Interpolation
mit
+
Die zweite Methode scheint in Bezug auf Gedächtnis / Geschwindigkeit effizienter zu sein als das, was ich gesehen habe (allerdings nicht gemessen). Alle drei Methoden werfen einen nicht initialisierten konstanten Fehler aus, wenn ROOT_DIR Null ist.
Wenn Sie mit Pfadnamen arbeiten, möchten Sie möglicherweise verwenden
File.join
, um zu vermeiden, dass das Pfadnamen-Trennzeichen durcheinander gebracht wird.Am Ende ist es Geschmackssache.
quelle
Der
+
Operator ist die normale Verkettungsoption und wahrscheinlich der schnellste Weg, um Zeichenfolgen zu verketten.Der Unterschied zwischen
+
und<<
besteht darin, dass<<
das Objekt auf der linken Seite geändert wird und+
nicht.quelle
+
und<<
werden in etwa gleich sein. Wenn Sie mit vielen oder wirklich großen Saiten zu tun haben, werden Sie möglicherweise einen Unterschied bemerken. Ich war überrascht, wie ähnlich sie auftraten. gist.github.com/28953115.times do ... end
für jeden Interpreter mehrmals ausführen (im selben Prozess - also alles in einen Block einschließen), erhalten Sie genauere Ergebnisse. Meine Tests haben gezeigt, dass Interpolation die schnellste Methode für alle Ruby-Interpreter ist. Ich hätte erwartet<<
, am schnellsten zu sein, aber deshalb messen wir uns.Wenn Sie nur Pfade verketten, können Sie Rubys eigene File.join-Methode verwenden.
quelle
von http://greyblake.com/blog/2012/09/02/ruby-perfomance-tricks/
Die Verwendung von
<<
akaconcat
ist weitaus effizienter als+=
, da letzteres ein zeitliches Objekt erstellt und das erste Objekt mit dem neuen Objekt überschreibt.Ausgabe:
quelle
Da dies ein Pfad ist, würde ich wahrscheinlich Array und Join verwenden:
quelle
Hier ist ein weiterer Maßstab, der von diesem Kern inspiriert ist . Es vergleicht Verkettung (
+
), Anhängen (<<
) und Interpolation (#{}
) für dynamische und vordefinierte Zeichenfolgen.Ausgabe:
Schlussfolgerung: Die Interpolation in der MRT ist schwer.
quelle
Ich würde Pathname bevorzugen:
über
<<
und+
von Ruby Docs:+
: Gibt einen neuen String zurück, der other_str enthält, das mit str verkettet ist<<
: Verkettet das angegebene Objekt mit str. Wenn das Objekt eine Fixnummer zwischen 0 und 255 ist, wird es vor der Verkettung in ein Zeichen konvertiert.Der Unterschied besteht also darin, was zum ersten Operanden wird (
<<
Änderungen an Ort und Stelle vornimmt,+
neue Zeichenfolge zurückgibt, damit der Speicher schwerer wird) und was, wenn der erste Operand Fixnum ist (<<
wird hinzugefügt, als wäre es ein Zeichen mit einem Code, der dieser Zahl entspricht,+
erhöht) Error)quelle
Pathname('/home/foo') + '/etc/passwd' # => #<Pathname:/etc/passwd>
. Dies ist beabsichtigt, basierend auf dem Rubydoc-Beispiel. Scheint, dass File.join sicherer ist.(Pathname(ROOT_DIR) + project + 'App.config').to_s
wenn Sie ein Zeichenfolgenobjekt zurückgeben möchten.Lassen Sie mich Ihnen all meine Erfahrungen damit zeigen.
Ich hatte eine Abfrage, die 32.000 Datensätze zurückgab. Für jeden Datensatz habe ich eine Methode aufgerufen, um diesen Datenbankdatensatz in eine formatierte Zeichenfolge zu formatieren und diese dann zu einer Zeichenfolge zu verketten, die am Ende dieses Prozesses in eine Datei auf der Festplatte umgewandelt wird.
Mein Problem war, dass nach der Aufzeichnung, ungefähr 24k, der Prozess des Verkettens des Strings einen Schmerz auslöste.
Ich habe das mit dem regulären Operator '+' gemacht.
Als ich zu '<<' wechselte, war das wie Magie. War sehr schnell.
Also erinnerte ich mich an meine alten Zeiten - eine Art von 1998 - als ich Java verwendete und String mit '+' verkettete und von String zu StringBuffer wechselte (und jetzt haben wir, Java-Entwickler, den StringBuilder).
Ich glaube, dass der Prozess von + / << in der Ruby-Welt der gleiche ist wie der von + / StringBuilder.append in der Java-Welt.
Die erste ordnet das gesamte Objekt im Speicher neu zu und die andere zeigt nur auf eine neue Adresse.
quelle
Verkettung, sagst du? Wie wäre es dann mit
#concat
Methode?In aller Fairness
concat
ist als voreingenommen<<
.quelle
"foo" "bar" 'baz" #=> "foobarabaz"
Hier sind weitere Möglichkeiten, dies zu tun:
Und so weiter ...
quelle
Sie können auch
%
Folgendes verwenden:Dieser Ansatz funktioniert auch mit
'
(einfachen) Anführungszeichen.quelle
Sie können
+
oder<<
Operator verwenden, aber in Ruby.concat
ist die Funktion am meisten bevorzugt, da sie viel schneller als andere Operatoren ist. Sie können es wie verwenden.quelle
.
nach deinem letztenconcat
Nein?Situation ist wichtig, zum Beispiel:
Im ersten Beispiel
+
wird dasoutput
Objekt durch Verketten mit dem Operator nicht aktualisiert. Im zweiten Beispiel<<
aktualisiert der Operator dasoutput
Objekt jedoch bei jeder Iteration. Für die oben genannte Art von Situation<<
ist es also besser.quelle
Sie können die Zeichenfolgendefinition direkt verketten:
quelle
Für Ihren speziellen Fall können Sie
Array#join
beim Erstellen des Dateipfadtyps auch eine Zeichenfolge verwenden:Dies hat einen angenehmen Nebeneffekt, wenn verschiedene Typen automatisch in Zeichenfolgen konvertiert werden:
quelle
Für Marionette:
quelle