differenza tra each.with_index e each_with_index in Ruby?


93

Sono davvero confuso sulla differenza tra each.with_indexe each_with_index. Hanno tipi diversi ma sembrano essere identici nella pratica.


6
A parte la leggera differenza che with_indexpermette un offset indice iniziale, with_indexè generalmente preferito se usato in combinazione con map, reduce, collect, ecc In breve, map.with_indexè più leggibile each_with_index.map. In un certo senso, se usato con map, è un sostituto del map_with_indexmetodo inesistente .
Cary Swoveland

Risposte:


170

Il with_indexmetodo accetta un parametro opzionale per compensare l'indice iniziale. each_with_indexfa la stessa cosa, ma non ha un indice iniziale opzionale.

Per esempio:

[: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

Uscite:

2: foo
3: bar
4: baz

0: foo
1: bar
2: baz

41

each_with_indexè stato introdotto in Ruby in precedenza. with_indexè stato introdotto in seguito:

  1. per consentire un utilizzo più ampio con vari enumeratori.
  2. per consentire a index di iniziare da un numero diverso da 0.

Oggi l'utilizzo with_indexsarebbe migliore dal punto di vista della generalità e della leggibilità, ma dal punto di vista della velocizzazione del codice, each_with_indexgira leggermente più veloce del each.with_index.

Quando ritieni che un singolo metodo possa essere facilmente espresso concatenando facilmente alcuni metodi, di solito è il caso che il singolo metodo sia più veloce della catena. Per quanto riguarda un altro esempio, reverse_eachfunziona più velocemente di reverse.each. Questi metodi hanno motivo di esistere.


1
Per essere onesti, però, l'offset non cambia l'indice, aggiunge semplicemente un numero all'indice. Quando controlli l'indice dopo la chiamata, scoprirai che non è interessato. Buone note come al solito, @sawa
vgoff

2
Non penso che la perf dovrebbe essere diversa (almeno non sostanzialmente). Nel reverseesempio, la reversesta tornando un'altra matrice, e non un enumeratore. Se ha restituito un enumeratore, non avrebbe dovuto essere più lento con una buona implementazione.
akostadinov
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.