2016-05-23 11 views
-2

Ich versuche, herauszufinden, ob es einen kürzeren Weg ist, den Code unten zu tun:Rubin kürzer 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 

Die oben ist für die Verwendung von terminal-table und colorize

+4

Fügen Sie ein Beispieldatenfeld hinzu, um anderen das Leben zu erleichtern, während Sie Lösungen testen. – Uzbekjon

Antwort

5

Wie wäre es damit :

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 

Es verwendet map statt each manuell Aufbau der Arrays zu vermeiden. Es verwendet auch einen Hash, um den Status der Farbe zuzuordnen, anstatt if-Anweisungen zu verwenden.

Sie könnten es weiter und entfernen Sie die innere if Anweisung, wenn Sie möchten, aber das ist zumindest eine Verbesserung.

+2

Große Antwort. Mit dem [colorize] (https://github.com/fazibear/colorize) Juwel kannst du 'v.colorize (color)' anstelle von 'v.send (color)' machen, was meiner Meinung nach ein wenig ist klarer. Sie können auch 'color_map.default =: yellow' oben verwenden, anstatt' color_map.fetch (v,: yellow) 'zu verwenden, damit alle Farbinformationen an der gleichen Stelle sind. –