前回のバージョンよりもずっとわかりにくいと評判が悪かった方の実装もさらします。「<<」が「*」だったのですが、それもまた評判が悪かったです。
class Product def self.<<(ary) self.new(ary) end def initialize(ary, parent=[[]]) @ary = ary @parent = parent end def <<(ary) self.class.new(ary, self) end def each @parent.each do |left| @ary.each do |right| yield(left + [right]) end end end end product = Product << ['q1'] << [1, 2] << ['q2'] << ['a', 'b'] << ['q3'] << [1, 3, 5] product.each do |x| p x end