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?

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

AboutRuby
quelle
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

toong
quelle
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?"
Manoj Govindan
quelle
Bedeuten die eckigen Klammern in Ruby ein Tupel? Ich dachte, eckige Klammern sind Listen ...
TIMEX
@ TimEX: Diese Frage wird helfen: stackoverflow.com/questions/525957/tuples-in-ruby
Manoj Govindan
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"]
Phadej
quelle