Как раскрасить один атрибут в хэше ruby

Мне нужно раскрасить только одно значение в хэше, вот так

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

h[:b] возвращает это

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

следовательно puts h[:b] работает как положено, тогда как h.to_s или же h.inspect дает это

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

Как вы можете видеть, все контрольные последовательности были экранированы.

Как h неявно преобразуется в строку при использовании puts hвсе, что я получаю в терминале это:

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

без каких-либо цветов.

Что я должен сделать, чтобы получить правильный цветной вывод?

2 ответа

Если вы можете жить без очков стиля:

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

Удары _d h вернет результат, который вы ожидаете.

Я нашел довольно грязное решение, но оно делает свое дело и не требует переопределения inspect за Hash

require 'colorize'
h = {a: 'a', b: 'b'.colorize(:red), c: 'c'}
puts eval("\"#{h.to_s.gsub('"', '\"')}\"")
Другие вопросы по тегам