ruby более короткая итерация массива

Я пытаюсь выяснить, есть ли более короткий способ сделать следующий код:

$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

1 ответ

Решение

Как насчет этого:

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 Заявление, если хотите, но это как минимум улучшение.

Другие вопросы по тегам