2010-10-01 6 views
5

Come potrei fare questa breve e estensibile:Come ASCIUGARE in Ruby?

 
    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

Non utilizzare 'per'. – Reactormonk

risposta

8
for f in @a 
    puts f 
end 

possiamo scritto

puts @a.join("\n") 

Nel caso generale, quando si vuoi fare qualcosa con diversi array puoi mettere gli array in un array e quindi usare each ad es.

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

e una volta arrivati ​​sul fare qualcosa di più complicato di una semplice stampa dei valori ha senso utilizzare il metodo estratto refactoring sull'operazione che si sta eseguendo per esempio

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

Infine, se è necessario mantenere etichette descrittive ("tutti come" etc.) è possibile utilizzare un hash:

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

Ma usa più memoria. – Hongli

+0

c'è un modo per avere almeno una piccola etichetta/tag per @a e @b stampati? risposta alla domanda nella tua seconda parte! Grazie! – poseid

+0

Il commento di Hongli è stato pubblicato prima di espandere la risposta con più suggerimenti. Per chiarezza, si riferisce all'uso di 'join' che costruirà una nuova stringa contenente tutti i valori. – mikej

0

Basta indovinare ...

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

mi piacerebbe fare qualcosa di simile:

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

'per f in ary; mette f; fine 'non è necessario. Solo 'puts ary' farà il lavoro. – steenslag