Non sto dicendo che Array
-> |value,index|
e Hash
-> |key,value|
non sia folle (vedi il commento di Horace Loeb), ma sto dicendo che c'è un modo sano di aspettarsi questo accordo.
Quando mi occupo di array, mi concentro sugli elementi dell'array (non sull'indice perché l'indice è transitorio). Il metodo è ciascuno con indice, ovvero ogni + indice o | ciascuno, indice | o |value,index|
. Ciò è anche coerente con l'indice visualizzato come argomento facoltativo, ad esempio | valore | è equivalente a | valore, indice = zero | che è coerente con | valore, indice |.
Quando ho a che fare con gli hash, spesso mi concentro più sulle chiavi che sui valori, e di solito mi occupo di chiavi e valori in quell'ordine, o key => value
o hash[key] = value
.
Se si desidera digitare l'anatra, utilizzare esplicitamente un metodo definito come mostrato da Brent Longborough o un metodo implicito come mostra maxhawkins.
Ruby si occupa di sistemare la lingua in base al programmatore, non del programmatore che si adatta alla lingua. Ecco perché ci sono così tanti modi. Ci sono così tanti modi di pensare a qualcosa. In Ruby, scegli il più vicino e il resto del codice di solito cade in modo estremamente accurato e conciso.
Per quanto riguarda la domanda originale, "Qual è il modo" giusto "per iterare attraverso un array in Ruby?", Beh, penso che il modo principale (cioè senza zucchero sintattico o potere orientato agli oggetti) sia quello di fare:
for index in 0 ... array.size
puts "array[#{index}] = #{array[index].inspect}"
end
Ma Ruby è incentrato sul potente zucchero sintattico e sul potere orientato agli oggetti, ma comunque qui è l'equivalente degli hash e le chiavi possono essere ordinate o meno:
for key in hash.keys.sort
puts "hash[#{key.inspect}] = #{hash[key].inspect}"
end
Quindi, la mia risposta è: "Il modo" giusto "di scorrere un array in Ruby dipende da te (cioè dal programmatore o dal team di programmazione) e dal progetto". Il programmatore Ruby migliore fa la scelta migliore (di quale potere sintattico e / o quale approccio orientato agli oggetti). Il miglior programmatore di Ruby continua a cercare altri modi.
Ora, voglio fare un'altra domanda, "Qual è il modo" giusto "per scorrere indietro un intervallo in Ruby?"! (Questa domanda è come sono arrivato a questa pagina.)
È bello da fare (per gli attaccanti):
(1..10).each{|i| puts "i=#{i}" }
ma non mi piace fare (per il passato):
(1..10).to_a.reverse.each{|i| puts "i=#{i}" }
Beh, in realtà non mi dispiace farlo troppo, ma quando insegno a tornare indietro, voglio mostrare ai miei studenti una bella simmetria (cioè con una differenza minima, ad esempio aggiungendo solo un contrario, o un passaggio -1, ma senza modificando qualcos'altro). Puoi fare (per simmetria):
(a=*1..10).each{|i| puts "i=#{i}" }
e
(a=*1..10).reverse.each{|i| puts "i=#{i}" }
cosa che non mi piace molto, ma non puoi farlo
(*1..10).each{|i| puts "i=#{i}" }
(*1..10).reverse.each{|i| puts "i=#{i}" }
#
(1..10).step(1){|i| puts "i=#{i}" }
(1..10).step(-1){|i| puts "i=#{i}" }
#
(1..10).each{|i| puts "i=#{i}" }
(10..1).each{|i| puts "i=#{i}" } # I don't want this though. It's dangerous
Alla fine potresti farlo
class Range
def each_reverse(&block)
self.to_a.reverse.each(&block)
end
end
ma voglio insegnare il puro Ruby piuttosto che gli approcci orientati agli oggetti (per ora). Vorrei ripetere all'indietro:
- senza creare un array (considerare 0..1000000000)
- lavorare per qualsiasi intervallo (ad es. stringhe, non solo numeri interi)
- senza usare alcun potere orientato agli oggetti extra (cioè nessuna modifica di classe)
Credo che ciò sia impossibile senza definire un pred
metodo, il che significa modificare la classe Range per usarla. Se puoi farlo per favore fatemelo sapere, altrimenti la conferma dell'impossibilità sarebbe apprezzata anche se sarebbe deludente. Forse Ruby 1.9 risolve questo problema.
(Grazie per il tuo tempo a leggere questo.)
array#each_with_index
usi|value, key|
perché il nome del metodo implica l'ordine, mentre l'ordine utilizzato perhash#each
imita lahash[key] = value
sintassi?