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?

FearMediocrity
quelle

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.

Mike Woodhouse
quelle
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.

gix
quelle
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.

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

ist ein anderer Weg, es zu tun.

Andrew Grimm
quelle
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}'
sqrcompass
quelle
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"
Clint Pachl
quelle
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 "

Níkolas La Porta
quelle