我试图找出是否有更短的方法来执行以下代码:
$my_array.each do |eh|
row = Array.new
eh.each do |k,v|
if k == 'state'
if eh[k] == "stopped"
row << eh[k].red
elsif eh[k] == "running"
row << eh[k].green
else
row << eh[k].yellow
end
else
row << eh[k]
end
end
data << row
end
以上内容适用于terminal-table
和colorize
答案 0 :(得分:5)
这个怎么样:
color_map = { 'stopped' => :red, 'running' => :green }
data = $my_array.map do |eh|
eh.map do |k,v|
if k == 'state'
v.send color_map.fetch(v, :yellow)
else
v
end
end
end
它使用map
而不是each
来避免手动构建数组。它还使用哈希将状态映射到颜色,而不是使用if语句。
如果您愿意,可以进一步删除内部if
语句,但这至少是一种改进。