ruby 更短的数组迭代

ruby shorter array iteration

我正在尝试找出是否有更短的方法来执行以下代码:

$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-tablecolorize

的使用

这个怎么样:

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 语句,但这至少是一个改进。