it-swarm.com.de

Ruby: Variablen in einem String zusammenführen

Ich bin auf der Suche nach einer besseren Methode, um Variablen in Ruby zusammenzuführen.

Zum Beispiel, wenn die Zeichenfolge wie folgt lautet:

"Die animalaction 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?

86
FearMediocrity

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.

224
Mike Woodhouse

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.

104
gix

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.

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

ist eine andere Möglichkeit, es zu tun.

13
Andrew Grimm

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}'
8
sqrcompass

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"
3
Clint Pachl

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"