2016-05-23 85 views
-2

我試圖找出是否有一個較短的方式做下面的代碼:紅寶石短陣迭代

$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

+4

添加示例數據數組以在測試解決方案時使其他人的生活更輕鬆。 – Uzbekjon

回答

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聲明,但這至少是一種改進。

+2

很好的回答。然而,使用[colorize](https://github.com/fazibear/colorize)gem,你可以做'v.colorize(color)'而不是'v.send(color)',我認爲它有點兒清晰。你也可以在頂部使用'color_map.default =:yellow'而不是'color_map.fetch(v,:yellow)',這樣所有的顏色信息都在同一個地方。 –