Как раскрасить один атрибут в хэше 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('"', '\"')}\"")