2017-06-04 2 views
1

Ich brauche nur einen Wert in Hash kolorieren, wie dasWie ein Attribut in Ruby-Hash kolorieren

require 'colorize' 
h = {a: 'a', b: 'b'.colorize(:red), c: 'c'} 

h[:b] gibt diese

"\e[0;31;49mb\e[0m" 

daher puts h[:b] funktioniert wie erwartet, während h.to_s oder h.inspect gibt dies

"{:a=>\"\\e[0;31;49ma\\e[0m\", :b=>\"\\e[0;34;49mb\\e[0m\"}" 

Wie Sie sehen können, wurden alle Kontrollsequenzen maskiert.

Als h wird implizit in String umgewandelt wird, während puts h verwenden, alles, was ich in Terminal bekommen, ist dies:

{:a=>"a", :b=>"\e[0;31;49mb\e[0m", :c=>"c"} 

ohne Farben.

Was soll ich tun, um die korrekte kolorierte Ausgabe zu erhalten?

+0

Die Ausgabe sieht mir richtig neu zu definieren. Wenn Sie h.values ​​setzen, erhalten Sie das b in rot. 'colorize' fügt einer Zeichenfolge ANSI-Farbsequenzen hinzu. Was hast du erwartet? –

+0

Die Ausgabe ist korrekt, aber alle Steuersequenzen sind ausgeblendet, und sie ist nicht eingefärbt. Überprüfen Sie es selbst –

+0

Die Ausgabe des Programms ist korrekt, alles koloriert fein unter Windows und Linux. Die Ausgabe von 'inspizieren' ist ordnungsgemäß ausgeblendet. Ich sehe das Problem nicht. –

Antwort

0

Wenn Sie ohne Style-Punkte leben können:

def _d(*args) 
    result = [] 
    args.each do |arg| 
    if arg.is_a?(Hash) 
     temp_string = "{" 
     parts = [] 
     arg.each { |k,v| parts << ":#{k}=>\"#{v}\""} 
     temp_string += parts.join(", ") 
     temp_string += "}" 
     result << temp_string 
    else 
    result << "#{arg}" 
    end 
    end 
    puts result.join(" ") 
end 

Schlagen _d h den Ausgang Ihrer Rückkehr erwarten.

+0

Dies scheint eine zu komplexe Lösung zu sein. Gibt es etwas aus der Box oder einfacher Workaround? –

0

fand ich eine ziemlich schmutzige Lösung, aber es funktioniert der Trick und erfordert keine inspect für Hash

require 'colorize' 
h = {a: 'a', b: 'b'.colorize(:red), c: 'c'} 
puts eval("\"#{h.to_s.gsub('"', '\"')}\"") 
Verwandte Themen