```daz wrote:

> h.each            {|ek, ev|  p [ek  , ev       ]}
> h.each_with_index {|e, idx|  p [e[0], e[1], idx]}
>#      ^_________^      ^_^       ^_^  ^^_^  ^_^
>#           A            B         C   D C    E
>
>

irb(main):012:0> class Hash
irb(main):013:1>   alias_method :orig_each, :each
irb(main):014:1>   def each
irb(main):015:2>     index = 0
irb(main):016:2>     orig_each do |ek, ev|
irb(main):017:3*       yield ek, ev, index
irb(main):018:3>       index += 1
irb(main):019:3>     end
irb(main):020:2>   end
irb(main):021:1> end
=> nil
irb(main):022:0> h = {:a => 1, :b => 2, :c => 3}
=> {:c=>3, :a=>1, :b=>2}
irb(main):023:0> h.each            {|ek, ev|  p [ek  , ev       ]}
[:c, 3]
[:a, 1]
[:b, 2]
=> {:c=>3, :a=>1, :b=>2}
irb(main):026:0> h.each {|ek, ev, idx|  p [ek, ev, idx]}
[:c, 3, 0]
[:a, 1, 1]
[:b, 2, 2]
=> {:c=>3, :a=>1, :b=>2}

This, as you already know, doesn't work with Arrays:
irb(main):027:0> def stuff
irb(main):028:1>   yield 1,2
irb(main):029:1> end
=> nil
irb(main):030:0> stuff {|a| p a}
(irb):30: warning: multiple values for a block parameter (2 for 1)
from (irb):28
[1, 2]
=> nil

But that's being warned about, so I hope that, in the future, 'a' will
be set to 1, instead of [1,2]. (...which would make the above trick work
for Arrays.)

It wouldn't provide automatic "with index" functionality, as your hack
does, but it seems (to me) to be the "cleanest" change to allow you to
implement _with_index methods without polluting the methods list.

Sorry if this is a rehash (no pun intended) of stuff covered in the