¿Cuál es el equivalente de Ruby de `s =“ hola,% s de Python! ¿Dónde está% s? % ("John", "Mary") `

141

En Python, este idioma para el formato de cadenas es bastante común

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

¿Cuál es el equivalente en Ruby?

TIMEX
fuente
3
No hay concatenación de cadenas, solo formato de cadenas. Y Google responderá esto más rápido de lo que incluso SO podría ... me tomó unos 20 segundos descubrir que puedes hacer exactamente lo mismo en Ruby.
No está solicitando concatenación, está solicitando formato / sustitución. Deberías cambiar tu pregunta. Por cierto, en ruby, la concatenación se realiza con operadores + o <<.
David

Respuestas:

246

La forma más fácil es la interpolación de cadenas . Puede inyectar pequeños trozos de código Ruby directamente en sus cadenas.

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

También puede hacer cadenas de formato en Ruby.

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

Recuerde usar corchetes allí. Ruby no tiene tuplas, solo matrices, y esas usan corchetes.

Sobre Ruby
fuente
1
Definitivamente usaría el primero, me parece más legible
David
1
El primero no funcionará, el # {} busca una variable, por lo que en este caso estaría imprimiendo la variable John, no la cadena "John". El segundo parece correcto.
Jason Noble
11
También debe tener cuidado de usar siempre comillas dobles, ya '#{name1}'que no es lo mismo que "#{name1}".
Droogans
3
La interpolación de cadenas no funciona entre comillas simples, debe usar comillas dobles. Por ejemplo: '#{"abc"}' # => "\#{\"abc\"}"pero lo que quieres es"#{"abc"}" # => "abc"
bschlueter
2
La primera forma no es equivalente: la plantilla no se puede pasar como un valor.
Ondra Žižka
51

En Ruby> 1.9 puedes hacer esto:

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

Ver los documentos

toong
fuente
Edité el equivalente de Idomatic Ruby allí, pero ahora me doy cuenta de que la respuesta aceptada ya lo hace, eliminé la 'edición' nuevamente: - /
toong
Al usar un hash con el operador de cadena%, si el símbolo de clave al que se hace referencia en la cadena de formato no está presente, obtendrá un KeyError.
user1164178
19

Casi de la misma manera:

irb(main):003:0> "hello, %s. Where is %s?" % ["John","Mary"]
=> "hello, John. Where is Mary?"
Manoj Govindan
fuente
En Ruby, ¿los corchetes significan una tupla? Pensé que los corchetes son listas ...
TIMEX
@TIMEX: Esta pregunta ayudará: stackoverflow.com/questions/525957/tuples-in-ruby
Manoj Govindan
3
Ruby no tiene tuplas (al menos no forjadas en el idioma). Sí, es una matriz ("lista" en Python realmente debería llamarse matrices ...).
9

En realidad casi lo mismo

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