Ruby の Enumerable#each_with_index を自前で実装してみた

Enumerable#each_with_index の実装がどうなっているのか知りたかったんですが、どうやら C で書かれているようなので自分で Ruby を使った実装を書いてみた。

module Enumerable
    def each_with_index2 &block
        if block_given?
            index = 0
            each { |it|
                block.call it, index
                index += 1
            }
        else
            Enumerator.new { |y|
                index = 0
                each { |it|
                    y.send :<<, it, index
                    index += 1
                    it
                }
            }
        end
    end
end

data = ["homu", "mami", "mado"]
data.each_with_index { |it, i|
    puts "#{i} : #{it}"
}
# => 0 : homu
# 1 : mami
# 2 : mado

data.each_with_index2.select { |it, i|
    i % 2 == 0
}
# => [["homu", 0], ["mado", 2]]

結構雑に書いたんだけどこんな感じでよいのかな。
Enumerator がいまいちなんなのかがよくわかってない…。