2008-10-13 14 views
9

En Python, vous pouvez le faire:Comment émuler les paramètres printf de Python dans Ruby?

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

Ce qui est le plus proche, plus simple langage Ruby pour reproduire ce comportement? (Pas monkeypatching la classe String, s'il vous plaît.)

EDIT: Une des ceci est des avantages vraiment excellents de que vous pouvez stocker la chaîne pré-traitée dans une variable et l'utiliser comme un « modèle », comme si :

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

Ceci est évidemment un exemple trivial, mais il y a beaucoup d'utilité pour pouvoir stocker une telle chaîne pour une utilisation ultérieure. La convention "Hi! I'm #{name}" de Ruby est similaire, mais l'évaluation immédiate la rend moins polyvalente.

Veuillez ne pas downvoter les réponses suggérant la technique #{var}, d'où elles viennent avant cette édition. (Noyau idée aléatoire: Peut-être que les réponses devraient être protégées des votes si un auteur de la question les marque comme "obsolètes" ...?)

Répondre

16

Vous pouvez également utiliser

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

ou

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

ou (ce qui a besoin de rubis 1.9, pour les autres exemples, je ne suis pas sûr)

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

Imprime

1: value1 2: value2 

restriction Important: Les clés utilisées du hachage (données dans mon exemple) doivent être des symboles.


Une remarque sur l'exemple ci-dessus: printf prend une chaîne de format et les paramètres facultatifs. Mais il y a aussi une méthode String#%.

Les quatre appels suivants ont tous le même résultat:

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 deuxième version utilise d'abord le String#% -method et envoie le résultat à printf.

2

Dans une chaîne entre guillemets dans Ruby, vous pouvez insérer le résultat d'une expression Ruby comme ceci:

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

Il suffit de mettre une expression à l'intérieur des accolades. (Cela peut aussi être quelque chose de plus complexe comme # {age + 5}, ou # {name + '' + last_name}, ou un appel de fonction.)

0

met "Bonjour, je suis # {nom}, et J'ai # {âge} ans. "

6

Il y a un truc bien à cela dans 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 

appellent ensuite avec

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

Ce n'est pas exactement ce que vous avez demandé, mais pourriez-vous donner un indice.

2

Ce qui fonctionne (entre-temps), cependant, est quelque chose le long des lignes 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

vous le faites comme ceci:

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

Lire ceci pour plus d'informations: http://ruby.runpaint.org/strings#sprintf-hash

Si vous avez besoin quelque chose de plus sophistiqué, lisez ERB, et les moteurs de modèle Google. Si vous avez besoin de générer des pages Web, des courriels, etc., vous constaterez que l'utilisation de moteurs de gabarit est une solution plus robuste.

+0

Ne fonctionne pas avec Ruby 1.9. –

+0

En fait, cela fonctionne si vous changez les clés dans le hachage 'values' en Symboles au lieu de Strings:' values ​​= {: hello => 'monde',: monde => 'bonjour'} '. Voir la dernière phrase dans [@ knut's answer] (http://stackoverflow.com/a/12563022/504611). –

+0

Vous avez raison @VickyChijwani –