2017-06-04 25 views
1

我需要上色只有一個哈希值,像如何上色紅寶石哈希一個屬性

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

h[:b]返回此

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

因此puts h[:b]作品如預期,而h.to_sh.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"} 

不含任何色素。

我該怎麼做才能得到正確的彩色輸出?

+0

輸出看起來正確的給我。如果你把h.values放在紅色的b中, 'colorize'將ANSI顏色序列添加到字符串中。你在期待什麼? –

+0

輸出正確,但所有控制序列都已轉義,且未着色。自己檢查 –

+0

該程序的輸出是正確的,在Windows和Linux上,所有內容都可以正常顯示。 'inspect'的輸出已正確轉義。我沒有看到問題。 –

回答

0

如果你生活中可以沒有風格要點:

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將返回你所期望的輸出。

+0

這似乎是太複雜的解決方案。有沒有什麼新的或更簡單的解決方法? –

0

我發現了一個相當骯髒的解決方案,但它的伎倆,並且不需要重新定義爲inspectHash

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