2010-10-01 7 views
5

Wie könnte ich diese kürzer und erweiterbar:Wie in Ruby zu trocknen?

 
    def overview 
    puts "All As:" 
    for f in @a 
     puts f 
    end 
    puts "\n" 

    puts "All Bs:" 
    for f in @b 
     puts f 
    end 
    end 
+2

Verwenden Sie 'for' nicht. – Reactormonk

Antwort

8
for f in @a 
    puts f 
end 

können wir

puts @a.join("\n") 

Im allgemeinen Fall geschrieben, wenn Sie Möchten Sie etwas mit mehreren Arrays machen, können Sie die Arrays in ein Array setzen und dannverwendenz.B.

[@a, @b].each do |list| 
    list.each { |value| puts value } 
end 

und sobald man sich auf etwas komplizierter als nur tun, um die Werte, die es sinnvoll, den Extrakt Methode Refactoring auf den Betrieb zu verwenden, macht Ausdrucken Sie ausführen, z

[@a, @b].each do |list| 
    do_something_with list 
end 

Schließlich, wenn Sie beschreibende Etiketten halten müssen ("All As" usw.) können Sie einen Hash verwenden können:

{'As' => @a, 'Bs' => @b}.each_pair do |label, values| 
    puts "All #{label}" 
    puts values.join("\n") 
end 
+0

Aber es verwendet mehr Speicher. – Hongli

+0

Gibt es eine Möglichkeit, mindestens ein kleines Label/Tag für @a und @b zu drucken? Frage beantwortet in Ihrem zweiten Teil! Vielen Dank! – poseid

+0

Honglis Kommentar wurde gepostet, bevor ich die Antwort mit mehreren Vorschlägen erweiterte. Zur Verdeutlichung bezieht er sich auf die Verwendung von "Join", die eine neue Zeichenfolge mit allen Werten erstellt. – mikej

0

raten Sie mal ...

def overview 
    puts "All As:" 
    puts_a(@a) 
    puts "\n" 

    puts "All Bs:" 
    puts_a(@b) 
end 

def puts_a(strs) 
    for str in strs 
    puts str 
    end 
end 
1

ich so etwas tun würde:

def overview 
    [@a, @b].each do |e| 
     puts e.join("\n") 
    end 
end 
4
def print_all(header, ary) 
    puts header 
    for f in ary 
    puts f 
    end 
end 

def overview 
    print_all("All As:", @a) 
    puts 
    print_all("All Bs:", @b) 
end 
+1

'für f in ary; setzt f; Ende 'ist unnötig. Einfach 'puts ary' wird den Job machen. – steenslag