まつもと ゆきひろです

Enumerable#interleave というメソッドを追加してはどうかと思い
ます。Clojureなどで見られるメソッドです。仕様は

/*
 *  call-seq:
 *     enum.interleave(arg, ...)                 => enumerator
 *     enum.interleave(arg, ...) {|x| block }    => nil
 *
 *  Takes one element from <i>enum</i> and following arguments then
 *  merges corresponding elements from each <i>args</i> into a flat
 *  sequence.  If a block is given, it is invoked for each element,
 *  otherwise an array of elements is returned.
 *
 *     a = [ 4, 5, 6 ]
 *     b = [ 7, 8, 9 ]
 *
 *     [1,2,3].interleave(a, b)      #=> [1, 4, 7, 2, 5, 8, 3, 6, 9]
 *     [1,2].interleave(a,b)         #=> [1, 4, 7, 2, 5, 8, 6, 9]
 *     a.interleave([1,2],[8])       #=> [4, 1, 8, 5, 2, 6]
 *
 */

という感じで。これを実装してたら Enumerable#zip は生成する長
さをレシーバーじゃなくて、最短の Enumerable に合わせるべきで
はないかと感じるようになったけど、それはまた別の話。

                                まつもと ゆきひろ /:|)