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 + ?

624voto

Keltia Punkte 14251

Dafür gibt es mehrere Möglichkeiten:

  1. Wie Sie mit << aber das ist nicht die üblich Weg

  2. Mit String-Interpolation

    source = "#{ROOT_DIR}/#{project}/App.config"
  3. con +

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

Die zweite Methode scheint in Bezug auf Speicher und Geschwindigkeit effizienter zu sein, soweit ich das gesehen habe (allerdings nicht gemessen). Alle drei Methoden werfen einen nicht initialisierten Konstantenfehler, wenn ROOT_DIR Null ist.

Wenn Sie mit Pfadnamen arbeiten, sollten Sie File.join um eine Verwechslung mit dem Pfadnamen-Trennzeichen zu vermeiden.

Letztendlich ist es eine Frage des Geschmacks.

107voto

Matt Burke Punkte 3246

En + Operator ist der normale Verkettungsoperator und wahrscheinlich der schnellste Weg zur Verkettung von Zeichenketten.

Der Unterschied zwischen + y << ist das << ändert das Objekt auf seiner linken Seite, und + nicht.

irb(main):001:0> s = 'a'
=> "a"
irb(main):002:0> s + 'b'
=> "ab"
irb(main):003:0> s
=> "a"
irb(main):004:0> s << 'b'
=> "ab"
irb(main):005:0> s
=> "ab"

81voto

georg Punkte 2189

Wenn Sie nur Pfade verketten wollen, können Sie Rubys eigene Methode File.join verwenden.

source = File.join(ROOT_DIR, project, 'App.config')

32voto

Danny Punkte 3639

Von http://greyblake.com/blog/2012/09/02/ruby-perfomance-tricks/

Verwendung von << alias concat ist weitaus effizienter als += da letztere ein temporäres Objekt erzeugt und das erste Objekt durch das neue Objekt überschreibt.

require 'benchmark'

N = 1000
BASIC_LENGTH = 10

5.times do |factor|
  length = BASIC_LENGTH * (10 ** factor)
  puts "_" * 60 + "\nLENGTH: #{length}"

  Benchmark.bm(10, '+= VS <<') do |x|
    concat_report = x.report("+=")  do
      str1 = ""
      str2 = "s" * length
      N.times { str1 += str2 }
    end

    modify_report = x.report("<<")  do
      str1 = "s"
      str2 = "s" * length
      N.times { str1 << str2 }
    end

    [concat_report / modify_report]
  end
end

Ausgabe:

____________________________________________________________
LENGTH: 10
                 user     system      total        real
+=           0.000000   0.000000   0.000000 (  0.004671)
<<           0.000000   0.000000   0.000000 (  0.000176)
+= VS <<          NaN        NaN        NaN ( 26.508796)
____________________________________________________________
LENGTH: 100
                 user     system      total        real
+=           0.020000   0.000000   0.020000 (  0.022995)
<<           0.000000   0.000000   0.000000 (  0.000226)
+= VS <<          Inf        NaN        NaN (101.845829)
____________________________________________________________
LENGTH: 1000
                 user     system      total        real
+=           0.270000   0.120000   0.390000 (  0.390888)
<<           0.000000   0.000000   0.000000 (  0.001730)
+= VS <<          Inf        Inf        NaN (225.920077)
____________________________________________________________
LENGTH: 10000
                 user     system      total        real
+=           3.660000   1.570000   5.230000 (  5.233861)
<<           0.000000   0.010000   0.010000 (  0.015099)
+= VS <<          Inf 157.000000        NaN (346.629692)
____________________________________________________________
LENGTH: 100000
                 user     system      total        real
+=          31.270000  16.990000  48.260000 ( 48.328511)
<<           0.050000   0.050000   0.100000 (  0.105993)
+= VS <<   625.400000 339.800000        NaN (455.961373)

11voto

Dejan Simic Punkte 7282

Da dies ein Pfad ist, würde ich wahrscheinlich Array und Join verwenden:

source = [ROOT_DIR, project, '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