9 Stimmen

Umwandlung von Hash in String in Ruby

Nehmen wir an, wir haben eine Raute:

flash = {}
flash[:error] = "This is an error."
flash[:info] = "This is an information."

Ich möchte sie in eine Zeichenkette umwandeln:

"<div class='error'>This is an error.</div><div class='info'>This is an information".

in netter Einzeiler ;)

Ich habe etwas Ähnliches gefunden:

flash.to_a.collect{|item| "<div class='#{item[0]}'>#{item[1]}</div>"}.join

Das löst mein Problem, aber vielleicht gibt es eine schönere Lösung in hashtable Klasse gebaut?

25voto

molf Punkte 70728

Hash enthält Enumerable so können Sie collect :

flash.collect { |k, v| "<div class='#{k}'>#{v}</div>" }.join

0voto

Bryan Ward Punkte 6053

Sie können die Schlüssel im Hash abrufen, indem Sie

flash.keys

und von dort aus können Sie ein neues Array von Strings erstellen und diese dann verbinden. Also etwas wie

flash.keys.collect {|k| "<div class=#{k}>#{flash[k]}</div>"}.join('')

Reicht das aus?

0voto

Ray Vernagus Punkte 6070

inject ist unendlich praktisch:

flash.inject("") { |acc, kv| acc << "<div class='#{kv[0]}'>#{kv[1]}</div>" }

0voto

Lukas Stejskal Punkte 2512
[:info, :error].collect { |k| "<div class=\"#{k}\">#{flash[k]}</div>" }.join

Das einzige Problem mit den bisher vorgestellten Lösungen ist, dass Sie in der Regel benötigen, um Flash-Nachrichten in einer bestimmten Reihenfolge aufzulisten - und Hash hat es nicht, so IMHO ist es besser, vordefinierte Array verwenden.

0voto

Simon Gate Punkte 582

Oder vielleicht doch?

class Hash
  def do_sexy
    collect { |k, v| "<div class='#{k}'>#{v}</div>" }.flatten
  end
end

flash = {}
flash[:error] = "This is an error."
flash[:info] = "This is an information."

puts flash.do_sexy

#outputs below
<div class='error'>This is an error.</div>
<div class='info'>This is an information.</div>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X