Ruby 1.9のEnumeratorはArray互換メソッドを持つと嬉しい
Ruby 1.9のArray#zipはArrayではなくてEnumerable::Enumeratorを返すようになった。しかも、EnumeratorはArray互換のメソッドを持たないのがタチが悪い。zipをブロックなしで使うことってあるんじゃないかな?
で、思い付いたのが、EnumeratorにArray互換のメソッドを持たせる方法。Module#define_methodと__send__でメソッドの内容を丸投げするのがミソ。
class Enumerable::Enumerator (Array.instance_methods - instance_methods ).each do |meth| define_method(meth) {|*args,&block| to_a.__send__(meth,*args,&block) } end end z = [1,2].zip([3,4]) z.class # => Enumerable::Enumerator z.to_a # => [[1, 3], [2, 4]] z.size # => 2 z << "a" # => [[1, 3], [2, 4], "a"] z = [1,2].zip([3,4]) z.each_index{|i| p i } z.reverse! # => [[2, 4], [1, 3]] z # => #<Enumerable::Enumerator:0xb7b53148> # >> 0 # >> 1