2010-08-24 4 views
118

In Python, dieses Idiom für String-Formatierung ist durchaus üblichWas ist Ruby entspricht Python `s =" Hallo,% s. Wo ist% s? " % ("John", "Mary") `

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

Was ist das Äquivalent in Ruby?

+3

Es gibt keine String-Verkettung, nur String-Formatierung. Und google wird das schneller beantworten, als es SO jemals könnte ... Ich brauchte ungefähr 20 Sekunden, um herauszufinden, dass Sie in Ruby genau dasselbe machen können. – delnan

+0

Sie fragen nicht nach Verkettung, Sie fragen nach Formatierung/Substitution. Sie sollten Ihre Frage ändern. Im Rubin wird die Verkettung übrigens mit den Operatoren + oder << durchgeführt. – David

Antwort

202

Der einfachste Weg ist string interpolation. Sie können kleine Stücke Ruby-Code direkt in Ihre Strings injizieren.

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

Sie können auch Zeichenfolgen in Ruby formatieren.

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

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

+1

Ich würde definitiv die erste verwenden, sieht es besser für mich aus – David

+1

Die erste wird nicht funktionieren, die # {} sucht nach einer Variablen, so in diesem Fall würde es die John-Variable, nicht die Zeichenfolge drucken " John". Die zweite sieht richtig aus. –

+0

Guter Punkt Jason, ich werde es bearbeiten, um es klarer zu machen. – AboutRuby

16

Fast die gleiche Art und Weise:

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

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

+0

@TIMEX: Diese Frage wird helfen: http://StackOverflow.com/Questions/525957/Tuples-in-Ruby –

+3

Ruby hat keine Tupel (zumindest nicht in die Sprache geschmiedet). Ja, es ist ein Array ("Liste" in Python sollte eigentlich Arrays heißen ...). – delnan

9

Eigentlich fast der gleiche

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

In Ruby 1.9 können Sie dies tun:

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

Edit: hat fehlen ':' s

Referenz: http://ruby-doc.org/core-1.9.3/String.html

+1

: name1 : name2 Nein? – masnun

+0

Ich habe dort in der * Idomatic Ruby * Entsprechung editiert - aber jetzt merke ich die akzeptierte Antwort tut das schon - entfernte die 'edit' wieder: -/ – toong

+0

Bei Verwendung eines Hash mit der Zeichenfolge% operator, wenn das Schlüsselsymbol in der Format String ist nicht vorhanden, Sie erhalten einen KeyError. – user1164178