Ruby: diferencia entre @ cars.each hacer | auto | y un coche en @cars hacer
-
19-09-2019 - |
Pregunta
(Perdón por la pregunta novato.) En Ruby, ¿cuál es la diferencia entre los bucles:
@cars.each do |car|
y
for car in @cars do
¿hay una diferencia en la eficiencia, o ¿por qué necesitamos dos (o más) formas de expresar la misma cosa? La segunda forma parece más elegante / natural para mí, pero es posible que falte alguna observación crucial, ¿por qué la primera puede ser la mejor opción.
Solución
más personas utilizan la notación @cars.each
porque que generaliza a otros métodos (como #inject
, #each_with_index
, #map
, etc, así como las devoluciones de llamada no iterador).
para / en es principalmente el azúcar solo sintáctica para #each
. La principal diferencia en cómo los dos trabajos es en ámbito de las variables:
irb> @cars = %w{ ford chevy honda toyota }
#=> ["ford", "chevy", "honda", "toyota"]
irb> @cars.each { |car| puts car }
ford
chevy
honda
toyota
#=> ["ford", "chevy", "honda", "toyota"]
irb> car
NameError: undefined local variable or method `car` for #<Object:0x399770 @cars=["ford", "chevy", "honda", "toyota"]>
from (irb):3
from /usr/local/bin/irb:12:in `<main>`
irb> for car in @cars
puts car.reverse
end
drof
yvehc
adnoh
atoyot
#=> ["ford", "chevy", "honda", "toyota"]
irb> car
#=> "toyota"
para / en hojas de la variable de iteración en su alcance después, mientras #each
no lo hace.
En lo personal, nunca utilice de rubí para / en la sintaxis.
Otros consejos
Creo que es simplemente azúcar sintáctica. Es funcionalmente equivalente, y no estoy al tanto de cualquier diferencia aplicación en el intérprete.
Nota -. Se puede perder el 'hacer' en el segundo