Estoy realmente confundido acerca de la diferencia entre each.with_index
y each_with_index
. Tienen diferentes tipos pero parecen ser idénticos en la práctica.
Respuestas:
El with_index
método toma un parámetro opcional para compensar el índice inicial. each_with_index
hace lo mismo, pero no tiene un índice de inicio opcional.
Por ejemplo:
[:foo, :bar, :baz].each.with_index(2) do |value, index|
puts "#{index}: #{value}"
end
[:foo, :bar, :baz].each_with_index do |value, index|
puts "#{index}: #{value}"
end
Salidas:
2: foo
3: bar
4: baz
0: foo
1: bar
2: baz
each_with_index
se introdujo en Ruby anteriormente. with_index
fue introducido más tarde:
0
.Hoy en día, usar with_index
sería mejor desde el punto de vista de generalidad y legibilidad, pero desde el punto de vista de acelerar el código, se each_with_index
ejecuta un poco más rápido que each.with_index
.
Cuando cree que un método único se puede expresar fácilmente mediante el encadenamiento directo de unos pocos métodos, suele ocurrir que el método único es más rápido que la cadena. En cuanto a otro ejemplo de esto, reverse_each
corre más rápido que reverse.each
. Estos métodos tienen razón de existir.
reverse
ejemplo, reverse
devuelve otra matriz y no un enumerador. Si devolvió un enumerador, entonces no debería haber sido más lento con una buena implementación.
with_index
permite un índice de desplazamiento inicial,with_index
se prefiere en general cuando se utiliza en conjunción conmap
,reduce
,collect
, etc. En resumen,map.with_index
lee mejor queeach_with_index.map
. En cierto sentido, cuando se usa conmap
, es un sustituto delmap_with_index
método inexistente .