From: Stefano Crocco Date: 2011-07-17T23:17:58+09:00 Subject: Re: Array#each vs. Array#each_index iteration On Sunday 17 July 2011 23:10:23 jake kaiden wrote: > hey folks, > > came across (what i consider) a strange difference between iterating > through an array with #each and #each_index - maybe someone can explain > this? > > i'm working on a baseball scorecard, that splits a string up into an > array, and then searches for keywords like "out," "single," "homer," > etc. here's a simplified example that demonstrates what is confusing to > me: > > ##### > string = "Joe struck out looking blah blah Bill out at second blah blah" > array = string.split > > array.each{|entry| > p array.index(entry) if entry == "out" > } > puts > array.each_index{|index| > p index if array[index] == "out" > } > ##### > > i expected both ways of iterating through the array to give the same > results (2 and 7,) but they don't - what's returned is: > > => 2 > => 2 > > => 2 > => 7 > > why the heck does #each return 2 twice, instead of returning 2 and 7 > like #each_index does? Because Array#index returns the index of the first occurrence of the argument, that is always 2, regardless of the iteration. In other words, Array#index is not suitable to be used from within each to access the index of the current element. If you need both the index and the element, you can use Array#each_with_index which passes both the element and its index to the block. > am i missing something obvious here? thanks in > advance for any help... > > - j I hope this helps Stefano