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
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
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
Aber es verwendet mehr Speicher. – Hongli
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
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
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
ich so etwas tun würde:
def overview
[@a, @b].each do |e|
puts e.join("\n")
end
end
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
'für f in ary; setzt f; Ende 'ist unnötig. Einfach 'puts ary' wird den Job machen. – steenslag
Verwenden Sie 'for' nicht. – Reactormonk