Wie kann ich Python namens printf Parameter in Ruby emulieren?
Frage
In Python, können Sie dies tun:
print "Hi! I'm %(name)s, and I'm %(age)d years old." % ({"name":"Brian","age":30})
Was ist in der Nähe, einfachste Ruby-Idiom dieses Verhalten zu replizieren? (No monkeypatching die String-Klasse, bitte.)
EDIT: Eine der wirklich hervorragenden Vorteile ist, dass Sie den vorverarbeiteten String in einer Variablen speichern können und sie als „Vorlage“ verwenden, etwa so:
template = "Hi! I'm %(name)s, and I'm %(age)d years old."
def greet(template,name,age):
print template % ({"name":name,"age":age})
Das ist natürlich ein triviales Beispiel, aber es gibt viel Nutzen in der Lage, für die spätere Verwendung eine solche Zeichenfolge zu speichern. Rubys "Hi! I'm #{name}"
Konvention ist kursorisch ähnlich, aber die sofortige Auswertung macht es weniger vielseitig.
Bitte Antworten nicht downvote die #{var}
Technik darauf hindeutet, wie sie aus der Zeit vor diesem bearbeiten kamen. (Random Idee Kernel: Vielleicht Antworten sollten von Stimmen, wenn eine Frage Autor markiert sie als „veraltet“ ... geschützt werden)
Lösung
Sie können auch verwenden
printf "1: %<key1>s 2: %<key2>s\n", {:key1 => "value1", :key2 => "value2"}
oder
data = {:key1 => "value1", :key2 => "value2"}
printf "1: %<key1>s 2: %<key2>s\n", data
oder (dies muss Ruby 1.9 für die anderen Beispiele, die ich nicht sicher bin)
data = {key1: "value1", key2: "value2"}
printf "1: %<key1>s 2: %<key2>s\n", data
Diese Drucke
1: value1 2: value2
Wichtige Einschränkung:. Die verwendeten Schlüssel des Hash ( Daten in meinem Beispiel) müssen Symbole sein
Eine Bemerkung zum Beispiel oben:
printf
nimmt ein Format-String und optionale Parameter. Aber es gibt auch eine String#%
-Methode.
Die folgenden vier Anrufe haben alle das gleiche Ergebnis:
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"}
Die zweite Version verwendet zuerst die String#%
-Methode und sendet das Ergebnis an printf
.
Andere Tipps
Sie tun es wie folgt aus:
values = {:hello => 'world', :world => 'hello'}
puts "%{world} %{hello}" % values
Lesen Sie diese für weitere Informationen: http://ruby.runpaint.org/strings#sprintf-hash
Wenn Sie etwas anspruchsvollere benötigen, lesen Sie über ERB und Google Template-Engines. Wenn Sie Web-Seiten generieren müssen, E-Mails usw. Sie werden feststellen, dass Template-Engines ist eine robustere Lösung.
Es gibt einige nette Trick, um diese in Ruby:
name = "Peter"
@age = 15 # instance variable
puts "Hi, you are #{name} and your age is #@age"
class Template
def %(h)
"Hi! I'm #{h[:name]}s, and I'm #{h[:age]}d years old."
end
end
Dann rufen Sie es mit
t=Template.new
t%({:name => "Peter", :age => 18})
Dies ist nicht genau das, was Sie gefragt, aber könnten Sie einen Hinweis geben.
In einem doppelten Anführungszeichen Zeichenfolge in Ruby, können Sie das Ergebnis eines Ruby-Ausdruck wie folgt ein:
puts "Hi! I'm #{name}, and I'm #{age} years old."
Nur einen Ausdruck in geschweiften Klammern gesetzt. (Es könnte auch etwas komplexere wie # {Alter + 5} oder {# name + '' + last_name} oder ein Funktionsaufruf sein.)
Was funktioniert (mittlerweile), aber ist etwas entlang der Linien von:
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"]]
puts "Hallo! Ich bin # {name}, und ich bin # {Alter} Jahre alt."