Was ist Ruby-Äquivalent zu Pythons `s =“ Hallo,% s. Wo ist% s? " % ("John", "Mary") `


141

In Python ist diese Redewendung für die Formatierung von Zeichenfolgen weit verbreitet

s = "hello, %s. Where is %s?" % ("John","Mary")

Was ist das Äquivalent in Ruby?


3
Es gibt keine Verkettung von Zeichenfolgen, nur die Formatierung von Zeichenfolgen. Und Google wird dies schneller beantworten, als es SO jemals könnte ... Ich habe ungefähr 20 Sekunden gebraucht, um herauszufinden, dass Sie in Ruby genau das Gleiche tun können.

Sie fragen nicht nach Verkettung, sondern nach Formatierung / Ersetzung. Sie sollten Ihre Frage ändern. In Ruby wird die Verkettung übrigens mit den Operatoren + oder << durchgeführt.
David

Antworten:


246

Der einfachste Weg ist die String-Interpolation . Sie können kleine Teile von Ruby-Code direkt in Ihre Zeichenfolgen einfügen.

name1 = "John"
name2 = "Mary"
"hello, #{name1}.  Where is #{name2}?"

Sie können Zeichenfolgen auch in Ruby formatieren.

"hello, %s.  Where is %s?" % ["John", "Mary"]

Denken Sie daran, dort eckige Klammern zu verwenden. Ruby hat keine Tupel, nur Arrays, und diese verwenden eckige Klammern.


1
Ich würde definitiv das erste verwenden, es sieht für mich besser lesbar aus
David

1
Das erste funktioniert nicht, das # {} sucht nach einer Variablen. In diesem Fall wird also die John-Variable gedruckt, nicht die Zeichenfolge "John". Der zweite sieht richtig aus.
Jason Noble

11
Sie sollten auch darauf achten, immer doppelte Anführungszeichen zu verwenden, da dies '#{name1}'nicht dasselbe ist wie "#{name1}".
Droogans

3
Die Zeichenfolgeninterpolation funktioniert nicht in einfachen Anführungszeichen. Sie müssen doppelte Anführungszeichen verwenden. Zum Beispiel: '#{"abc"}' # => "\#{\"abc\"}"aber was Sie wollen ist"#{"abc"}" # => "abc"
bschlueter

2
Der erste Weg ist kein Äquivalent - die Vorlage kann nicht als Wert weitergegeben werden.
Ondra Žižka

51

In Ruby> 1.9 können Sie dies tun:

s =  'hello, %{name1}. Where is %{name2}?' % { name1: 'John', name2: 'Mary' }

Siehe die Dokumente


Ich habe dort im Idomatic Ruby- Äquivalent bearbeitet - aber jetzt merke ich, dass die akzeptierte Antwort dies bereits tut - habe die 'Bearbeitung' wieder entfernt: - /
toong

Wenn bei Verwendung eines Hashs mit dem Operator string% das in der Formatzeichenfolge angegebene Schlüsselsymbol nicht vorhanden ist, wird ein KeyError angezeigt.
user1164178

19

Fast genauso:

irb(main):003:0> "hello, %s. Where is %s?" % ["John","Mary"]
=> "hello, John. Where is Mary?"

Bedeuten die eckigen Klammern in Ruby ein Tupel? Ich dachte, eckige Klammern sind Listen ...
TIMEX


3
Ruby hat keine Tupel (zumindest nicht in die Sprache gefälscht). Ja, es ist ein Array ("Liste" in Python sollte eigentlich Arrays heißen ...).

9

Eigentlich fast das gleiche

s = "hello, %s. Where is %s?" % ["John","Mary"]
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.