Have you ever used with_index
? Not each_with_index
which is similar but slightly different. Did you know that you can do map.with_index
?
Adding with_index
to an enumeration lets you enumerate that enumeration. Say that ten times fast. A quick example will clarify that a bit. Let’s say I have a list of three, I don’t know, famous Martians.
martians = ["Marvin", "J'onn J'onzz", "Mark Watney"]
I’ll list them along with their current position in the array.
> martians
* .each
* .with_index(1) do |martian, i|
* puts "#{i}) #{martian}"
> end
1) Marvin
2) J'onn J'onzz
3) Mark Watney
=> ["Marvin", "J'onn J'onzz", "Mark Watney"]
As I mentioned earlier, with_index
isn’t limited to each. I could replace each with map
in the example above.
> martians
* .map
* .with_index(1) do |martian, i|
* "#{i}) #{martian}"
> end
=> ["1) Marvin", "2) J'onn J'onzz", "3) Mark Watney"]
You probably noticed that I’m passing 1
to with_index
. It accepts an integer offset defaulted to 0
. I’ve found this to be handy when generating user-facing information. They usually don’t want their lists to be zero-indexed. No more having to do i + 1
inside the block. It’s also useful when you have a dynamic list that starts after some hard-coded entries.