403 Stimmen

String-Verkettung in Ruby

Ich bin auf der Suche nach einer eleganteren Methode zur Verkettung von Strings in Ruby.

Ich habe die folgende Zeile:

source = "#{ROOT_DIR}/" << project << "/App.config"

Gibt es eine schönere Methode, dies zu tun?

Und was ist eigentlich der Unterschied zwischen << y + ?

10voto

Adobe Punkte 11816

Hier ist ein weiterer Benchmark, der von dieser Kern . Es vergleicht die Verkettung ( + ), Anhängen ( << ) und Interpolation ( #{} ) für dynamische und vordefinierte Zeichenfolgen.

require 'benchmark'

# we will need the CAPTION and FORMAT constants:
include Benchmark

count = 100_000

puts "Dynamic strings"

Benchmark.benchmark(CAPTION, 7, FORMAT) do |bm|
  bm.report("concat") { count.times { 11.to_s +  '/' +  12.to_s } }
  bm.report("append") { count.times { 11.to_s << '/' << 12.to_s } }
  bm.report("interp") { count.times { "#{11}/#{12}" } }
end

puts "\nPredefined strings"

s11 = "11"
s12 = "12"
Benchmark.benchmark(CAPTION, 7, FORMAT) do |bm|
  bm.report("concat") { count.times { s11 +  '/' +  s12 } }
  bm.report("append") { count.times { s11 << '/' << s12 } }
  bm.report("interp") { count.times { "#{s11}/#{s12}"   } }
end

Ausgabe:

Dynamic strings
              user     system      total        real
concat    0.050000   0.000000   0.050000 (  0.047770)
append    0.040000   0.000000   0.040000 (  0.042724)
interp    0.050000   0.000000   0.050000 (  0.051736)

Predefined strings
              user     system      total        real
concat    0.030000   0.000000   0.030000 (  0.024888)
append    0.020000   0.000000   0.020000 (  0.023373)
interp    3.160000   0.160000   3.320000 (  3.311253)

Schlussfolgerung: Die Interpolation in der MRT ist schwer.

6voto

Marcio Mangar Punkte 156

Lassen Sie mich Ihnen meine Erfahrungen damit zeigen.

Ich hatte eine Abfrage, die 32k von Datensätzen zurückgegeben, für jeden Datensatz rief ich eine Methode zu formatieren, dass Datenbank-Datensatz in eine formatierte Zeichenfolge und als verketten, dass in eine Zeichenfolge, die am Ende dieses Prozesses wird in eine Datei auf der Festplatte drehen.

Mein Problem war, dass durch die Aufzeichnung geht, um 24k, der Prozess der Verkettung der String auf ein Schmerz gedreht.

Ich habe das mit dem normalen '+'-Operator gemacht.

Als ich zum '<<' wechselte, war das wie Magie. War wirklich schnell.

Also erinnerte ich mich an meine alten Zeiten - so ungefähr 1998 - als ich Java benutzte 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 derselbe ist wie + / StringBuilder.append in der Java-Welt.

Bei der ersten wird das gesamte Objekt im Speicher neu zugewiesen, bei der anderen verweist es lediglich auf eine neue Adresse.

5voto

Imran Alavi Punkte 67

Hier finden Sie weitere Möglichkeiten, dies zu tun:

"String1" + "String2"

"#{String1} #{String2}"

String1<<String2

Und so weiter ...

5voto

Boris Stitnicky Punkte 12077

Verkettung, sagen Sie? Wie wäre es mit #concat Methode?

a = 'foo'
a.object_id #=> some number
a.concat 'bar' #=> foobar
a.object_id #=> same as before -- string a remains the same object

In aller Fairness, concat wird aliasiert als << .

2voto

Muhammad Zubair Punkte 315

Sie können verwenden + o << Operator, aber in Ruby .concat Funktion ist am besten geeignet, da sie viel schneller ist als andere Operatoren. Sie können sie wie folgt verwenden.

source = "#{ROOT_DIR}/".concat(project.concat("/App.config"))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X