2008-10-13 5 views
9

En Python, se puede hacer esto:¿Cómo emulo los parámetros printf con nombre de Python en Ruby?

print "Hi! I'm %(name)s, and I'm %(age)d years old." % ({"name":"Brian","age":30}) 

Cuál es el más cercano, más simple Rubí lenguaje de replicar este comportamiento? (No se monkeypatching la clase String, por favor.)

EDIT: Uno de los realmente excelentes ventajas de esto es que se puede almacenar la cadena de pre-procesado en una variable y utilizarlo como una "plantilla", al igual que :

template = "Hi! I'm %(name)s, and I'm %(age)d years old." 
def greet(template,name,age): 
    print template % ({"name":name,"age":age}) 

obviamente, esto es un ejemplo trivial, pero hay un montón de utilidad en ser capaz de almacenar una cadena de este tipo para su uso posterior. La convención de Ruby "Hi! I'm #{name}" es similar en apariencia, pero la evaluación inmediata la hace menos versátil.

No revoque las respuestas sugiriendo la técnica #{var}, ya que vinieron antes de esta edición. (Núcleo de idea aleatoria: ¿Quizás las respuestas deberían estar protegidas de los votos si el autor de una pregunta las señala como "obsoletas" ...?)

Respuesta

16

También puede utilizar

printf "1: %<key1>s 2: %<key2>s\n", {:key1 => "value1", :key2 => "value2"} 

o

data = {:key1 => "value1", :key2 => "value2"} 
printf "1: %<key1>s 2: %<key2>s\n", data 

o (esto necesita rubí 1.9, para los otros ejemplos no estoy seguro)

data = {key1: "value1", key2: "value2"} 
printf "1: %<key1>s 2: %<key2>s\n", data 

Esto imprime

1: value1 2: value2 

restricción importante: Las claves utilizadas del hash ( datos en mi ejemplo) deben ser símbolos.


Una observación en el ejemplo anterior: printf toma una cadena de formato y los parámetros opcionales. Pero también hay un String#% -metodo.

Los siguientes cuatro llamadas tienen todas el mismo resultado:

printf "1: %<key1>s 2: %<key2>s\n" , {:key1 => "value1", :key2 => "value2"} 
printf "1: %<key1>s 2: %<key2>s\n" % {:key1 => "value1", :key2 => "value2"} 
print "1: %<key1>s 2: %<key2>s\n" % {:key1 => "value1", :key2 => "value2"} 
puts "1: %<key1>s 2: %<key2>s" % {:key1 => "value1", :key2 => "value2"} 

La segunda versión utiliza por primera vez el -method String#% y envía el resultado a printf.

2

En una cadena de comillas dobles en Ruby, puede insertar el resultado de una expresión de Ruby como esto:

puts "Hi! I'm #{name}, and I'm #{age} years old." 

Simplemente ponga una expresión dentro de las llaves. (También podría ser algo más complejo como # {age + 5}, o # {name + '' + last_name}, o una llamada a función.)

0

puts "Hola, soy # {name}, y Tengo # {edad} años. "

6

Hay algún buen truco para esto en Ruby:

name = "Peter" 
@age = 15 # instance variable 
puts "Hi, you are #{name} and your age is #@age" 
3
class Template 

    def %(h) 
    "Hi! I'm #{h[:name]}s, and I'm #{h[:age]}d years old." 


    end 
end 

Entonces llaman con

t=Template.new 
t%({:name => "Peter", :age => 18}) 

Esto no es exactamente lo que usted pidió pero que podría dar una pista.

2

Lo que funciona (por su parte), sin embargo, es algo a lo largo de las líneas de:

d = {"key1" => "value1", "key2" => "value2"} 
s = "string to be magically induced with variables, which are \n * %s and \n * %s.\n" 
print s%d.values() 
# or 
print s%[d["key1"], d["key2"]] 
15

que hacerlo de esta manera:

values = {:hello => 'world', :world => 'hello'} 
puts "%{world} %{hello}" % values 

leer esto para más información: http://ruby.runpaint.org/strings#sprintf-hash

Si necesita algo más sofisticado, leer acerca de ERB, y motores de plantilla de Google. Si necesita generar páginas web, correos electrónicos, etc. encontrará que el uso de motores de plantillas es una solución más sólida.

+0

No funciona con Ruby 1.9. –

+0

En realidad, esto funciona si cambia las claves en el hash 'values' a Symbols en lugar de Strings:' values ​​= {: hello => 'world',: world => 'hello'} '. Vea la última oración en la respuesta de [@ knut] (http://stackoverflow.com/a/12563022/504611). –

+0

Tienes razón @VickyChijwani –

Cuestiones relacionadas