No estoy diciendo que Array
->|value,index|
y Hash
->|key,value|
no es una locura (ver el comentario de Horacio Loeb), pero estoy diciendo que hay una manera sana para esperar que este arreglo.
Cuando me ocupo de matrices, estoy centrado en los elementos de la matriz (no en el índice porque el índice es transitorio). El método tiene cada uno índice, es decir, cada índice +, o | cada, índice | o |value,index|
. Esto también es consistente con que el índice se vea como un argumento opcional, p. | valor | es equivalente a | valor, índice = nil | que es consistente con | valor, índice |.
Cuando estoy tratando con hashes, estoy a menudo más centrado en las claves que los valores, y por lo general estoy tratando con claves y valores en ese orden, ya sea key => value
o hash[key] = value
.
Si desea escribir patos, utilice explícitamente un método definido como lo mostró Brent Longborough, o un método implícito como lo mostró maxhawkins.
Ruby se trata de acomodar el idioma para adaptarse al programador, no de que el programador se adapte al idioma. Es por eso que hay muchas maneras. Hay muchas maneras de pensar sobre algo. En Ruby, eliges el más cercano y el resto del código generalmente cae de forma muy clara y concisa.
En cuanto a la pregunta original, "¿Cuál es la forma" correcta "de iterar a través de una matriz en Ruby?", Bueno, creo que la forma básica (es decir, sin poder de azúcar sintáctico o poder orientado a objetos) es hacer:
for index in 0 ... array.size
puts "array[#{index}] = #{array[index].inspect}"
end
pero Ruby es todo sobre el azúcar sintáctica de gran alcance y el poder orientado a objetos, pero de todos modos aquí es el equivalente para los hashes, y las teclas se pueden pedir o no:
for key in hash.keys.sort
puts "hash[#{key.inspect}] = #{hash[key].inspect}"
end
lo tanto, mi respuesta es , "La forma" correcta "de iterar a través de una matriz en Ruby depende de ti (es decir, el programador o el equipo de programación) y el proyecto ". El mejor programador de Ruby hace la mejor elección (de qué potencia sintáctica y qué enfoque orientado a objetos). El mejor programador de Ruby continúa buscando más formas.
Ahora, quiero hacer otra pregunta: "¿Qué es la‘correcta’para iterar a través de un rango en Ruby hacia atrás?"! (Esta pregunta es cómo llegué a esta página.)
Es bueno hacer (para los delanteros):
(1..10).each{|i| puts "i=#{i}" }
pero no me gusta hacer (por el revés):
Bueno, realmente no me importa hacer eso demasiado, pero cuando estoy enseñando retroceder, quiero mostrar a mis alumnos una buena simetría (es decir, con una diferencia mínima, por ejemplo, solo agregar un reverso, o un paso -1, pero sin modificar nada más). Usted puede hacer (por simetría):
(a=*1..10).each{|i| puts "i=#{i}" }
y
(a=*1..10).reverse.each{|i| puts "i=#{i}" }
la que no me gusta mucho, pero no se puede hacer
(*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
Se podría en última instancia, hacer
class Range
def each_reverse(&block)
self.to_a.reverse.each(&block)
end
end
pero Quiero enseñar enfoques puros de Ruby en lugar de enfoques orientados a objetos (por el momento). Me gustaría repetir al revés:
- sin crear una matriz (considerar 0..1000000000)
- de trabajo para cualquier rango (por ejemplo, cadenas, no sólo enteros)
- sin necesidad de utilizar ningún poder orientada a objetos extra (es decir, no hay modificación de clase)
Creo que esto es imposible sin definir un método pred
, lo que significa que se debe modificar la clase Range para usarlo. Si puede hacerlo, hágamelo saber, de lo contrario, la confirmación de la imposibilidad sería apreciada, aunque sería decepcionante. Quizás Ruby 1.9 aborda esto.
(Gracias por su tiempo en leer esto.)
supongo array '' # each_with_index' utiliza | valor, clave | 'debido a que el nombre del método implica el orden, mientras que el orden utilizado para' almohadilla # each' imita la sintaxis 'hash [key] = value'? – benjineer
Si recién está comenzando con bucles en Ruby, luego revise [usando seleccionar, rechazar, recopilar, inyectar y detectar] (http: // matthewcarriere.com/2008/06/23/using-select-reject-collect-inject-and-detect /) –