【问题标题】:How to colorize one attribute in ruby hash如何为红宝石哈希中的一个属性着色
【发布时间】:2017-06-04 00:09:19
【问题描述】:

我只需要对哈希中的一个值进行着色,就像那样

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"}

没有任何颜色。

我应该怎么做才能获得正确的colorized输出?

【问题讨论】:

  • 输出对我来说是正确的。如果你 puts h.values 你会得到红色的 b。 colorize 将 ANSI 颜色序列添加到字符串。你期待什么?
  • 输出是正确的,但是所有的控制序列都被转义了,并且没有上色。自己检查一下
  • 程序的输出是正确的,在 Windows 和 Linux 上一切都很好。 inspect 的输出被正确转义。我没有看到问题。
  • 不行,试试代码。问题是我不希望inspect 像那样转义输出
  • 我确实在两个不同的系统上尝试过代码。正常工作。 inspect 转义输出,以便您按照设计看到每个字符。如果你想要不同的东西,你不应该使用inspect

标签: ruby colorize text-coloring


【解决方案1】:

如果你可以没有风格点生活:

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 将返回您期望的输出。

【讨论】:

  • 这似乎是太复杂的解决方案。有什么开箱即用或更简单的解决方法吗?
【解决方案2】:

我找到了一个相当肮脏的解决方案,但它可以解决问题并且不需要为 Hash 重新定义 inspect

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

【讨论】:

    猜你喜欢
    • 2019-11-20
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多