Ich bin auf der Suche nach einer besseren Methode, um Variablen in Ruby zusammenzuführen.
Zum Beispiel, wenn die Zeichenfolge wie folgt lautet:
"Die animal
action
der second_animal
"
Und ich habe Variablen für animal
, action
und second_animal
. Was ist der bevorzugte Weg, diese Variablen in den String einzufügen?
Die idiomatische Art 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, um die eingebaute Platzhalterersetzung zu verwenden. Sie können sie nicht durch einfache Anführungszeichen (') ersetzen, da die Zeichenfolge unverändert bleibt.
Sie können Sprintf-ähnliche Formatierungen 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 Methoden: (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 sogar die Argumentnummer explizit angeben und sie umeinander verteilen:
'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. Beispielsweise können Sie nicht vermeiden, animal
zu definieren.
Ich würde den #{}
-Konstruktor verwenden, wie in den anderen Antworten dargelegt. Ich möchte auch darauf hinweisen, dass hier eine echte Subtilität vorhanden ist, auf die Sie hier achten sollten:
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 Strings mit einfachen Anführungszeichen erstellt werden können (wie die Variablen first_name
und last_name
zeigen, kann der #{}
-Konstruktor nur in Strings mit doppelten Anführungszeichen verwendet werden.
["The", animal, action, "the", second_animal].join(" ")
ist eine andere Möglichkeit, es zu tun.
Dies wird als String-Interpolation bezeichnet, und Sie machen es so:
"The #{animal} #{action} the #{second_animal}"
Wichtig: Es funktioniert nur, wenn Zeichenfolge in Anführungszeichen ("") steht.
Beispiel für Code, der nicht wie erwartet funktioniert:
'The #{animal} #{action} the #{second_animal}'
Das Standard-Templatesystem für ERB 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"
Sie können es mit Ihren lokalen Variablen verwenden, wie folgt:
@animal = "Dog"
@action = "licks"
@second_animal = "Bird"
"The #{@animal} #{@action} the #{@second_animal}"
die Ausgabe wäre: "Die Hundleckt das Vogel"