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)

War es hilfreich?

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."

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top