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