Robert Klemme wrote:
> 2010/9/14 Jörg W Mittag <JoergWMittag+Ruby / googlemail.com>:
>> Handy Gandy wrote:
>>> I have an array of N arrays A_i: [A_1,A_2,...,A_N].
>>>
>>> I want to iterate over the cartesian product A_1xA_2...xA_N.
>>>
>>> Is there a simple way of doing this without specifying N?
>>  ary = [[1, 2], [3, 4, 5], [6, 7, 8, 9]]
>>  ary.first.product(*ary.drop(1))
>>  # => [
>>  # =>  [1, 3, 6], [1, 3, 7], [1, 3, 8], [1, 3, 9],
>>  # =>  [1, 4, 6], [1, 4, 7], [1, 4, 8], [1, 4, 9],
>>  # =>  [1, 5, 6], [1, 5, 7], [1, 5, 8], [1, 5, 9],
>>  # =>  [2, 3, 6], [2, 3, 7], [2, 3, 8], [2, 3, 9],
>>  # =>  [2, 4, 6], [2, 4, 7], [2, 4, 8], [2, 4, 9],
>>  # =>  [2, 5, 6], [2, 5, 7], [2, 5, 8], [2, 5, 9]
>>  # => ]
> This looks nice.  How did you do the formatting?

By hand :-)

Though I assume Hirb or awesome_print could probably do it
automatically.

> If destruction is allowed, we can do:
> 
> irb(main):013:0> ary = [[1, 2], [3, 4, 5], [6, 7, 8, 9]]
> => [[1, 2], [3, 4, 5], [6, 7, 8, 9]]
> irb(main):014:0> pp ary.shift.product(*ary)
> [[1, 3, 6],
> ...
> => nil

That's nice. Having toyed with Scala and Haskell, mutation just feels
*so* dirty to me. I guess I need some re-education to get back into
the idiomatic Ruby mindset.

jwm