Ruby: Variablen zu einer Zeichenfolge zusammenführen


94

Ich suche nach einer besseren Möglichkeit, Variablen in Ruby zu einem String zusammenzuführen.

Zum Beispiel, wenn die Zeichenfolge ungefähr so ​​lautet:

"Das animal actiondas second_animal"

Und ich habe Variablen für animal, actionund second_animal, was ist die bevorzugte Art und Weise in diese Variablen zu setzen , um die Zeichenfolge?

Antworten:


240

Der idiomatische Weg ist, so etwas zu schreiben:

"The #{animal} #{action} the #{second_animal}"

Beachten Sie die doppelten Anführungszeichen ("), die die Zeichenfolge umgeben: Dies ist der Auslöser für Ruby, die integrierte Platzhalterersetzung zu verwenden. Sie können sie nicht durch einfache Anführungszeichen (') ersetzen, da sonst die Zeichenfolge unverändert bleibt.


2
Entschuldigung, vielleicht habe ich das Problem zu stark vereinfacht. Der String wird aus einer Datenbank abgerufen, und die Variable hängt von einer Reihe von Faktoren ab. Normalerweise würde ich einen Ersatz für 1 oder 2 Variablen verwenden, aber dies kann mehr sein. Irgendwelche Gedanken?
FearMediocrity

Das Konstrukt # {} ist wahrscheinlich das schnellste (obwohl mir das immer noch nicht intuitiv erscheint). Neben dem Vorschlag von gix können Sie auch Zeichenfolgen mit + oder << zusammenstellen. Möglicherweise werden jedoch einige Zwischenzeichenfolgen erstellt, was kostspielig ist.
Mike Woodhouse

Beste Weg, um Variablen zu interpolieren
Dragutescu Alexandru

114

Sie können die sprintf-ähnliche Formatierung verwenden, um Werte in die Zeichenfolge einzufügen. Dazu muss die Zeichenfolge Platzhalter enthalten. Fügen Sie Ihre Argumente in ein Array ein und verwenden Sie eine der folgenden Möglichkeiten: (Weitere Informationen finden Sie in der Dokumentation zu Kernel :: sprintf .)

fmt = 'The %s %s the %s'
res = fmt % [animal, action, other_animal]  # using %-operator
res = sprintf(fmt, animal, action, other_animal)  # call Kernel.sprintf

Sie können die Argumentnummer sogar explizit angeben und ummischen:

'The %3$s %2$s the %1$s' % ['cat', 'eats', 'mouse']

Oder geben Sie das Argument mit Hash-Schlüsseln an:

'The %{animal} %{action} the %{second_animal}' %
  { :animal => 'cat', :action=> 'eats', :second_animal => 'mouse'}

Beachten Sie, dass Sie dem %Operator einen Wert für alle Argumente angeben müssen. Zum Beispiel können Sie das Definieren nicht vermeiden animal.


18

Ich würde den #{}Konstruktor verwenden, wie in den anderen Antworten angegeben. Ich möchte auch darauf hinweisen, dass es hier eine echte Subtilität gibt, auf die man hier achten muss:

2.0.0p247 :001 > first_name = 'jim'
 => "jim" 
2.0.0p247 :002 > second_name = 'bob'
 => "bob" 
2.0.0p247 :003 > full_name = '#{first_name} #{second_name}'
 => "\#{first_name} \#{second_name}" # not what we expected, expected "jim bob"
2.0.0p247 :004 > full_name = "#{first_name} #{second_name}"
 => "jim bob" #correct, what we expected

Während Zeichenfolgen mit einfachen Anführungszeichen erstellt werden können (wie durch die Variablen first_nameund gezeigt last_name, kann der #{}Konstruktor nur in Zeichenfolgen mit doppelten Anführungszeichen verwendet werden.


13
["The", animal, action, "the", second_animal].join(" ")

ist ein anderer Weg, es zu tun.


9

Dies wird als Zeichenfolgeninterpolation bezeichnet, und Sie tun dies folgendermaßen:

"The #{animal} #{action} the #{second_animal}"

Wichtig: Es funktioniert nur, wenn sich die Zeichenfolge in doppelten Anführungszeichen ("") befindet.

Beispiel für Code, der nicht wie erwartet funktioniert:

'The #{animal} #{action} the #{second_animal}'

Vielen Dank, dass Sie den richtigen Begriff verwendet haben, damit neue Programmierer lernen können: Interpolation.
Mike Bethany

3

Das Standard-ERB-Template-System funktioniert möglicherweise für Ihr Szenario.

def merge_into_string(animal, second_animal, action)
  template = 'The <%=animal%> <%=action%> the <%=second_animal%>'
  ERB.new(template).result(binding)
end

merge_into_string('tiger', 'deer', 'eats')
=> "The tiger eats the deer"

merge_into_string('bird', 'worm', 'finds')
=> "The bird finds the worm"

0

Sie können es mit Ihren lokalen Variablen wie folgt verwenden:

@animal = "Dog"
@action = "licks"
@second_animal = "Bird"

"The #{@animal} #{@action} the #{@second_animal}"

Die Ausgabe wäre: "Der Hund leckt den Vogel "

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.