Нахождение произведения переменного количества массивов Ruby

Я ищу все комбинации отдельных элементов из переменного количества массивов. Как мне это сделать в Ruby?

Учитывая два массива, я могу использовать Array.product следующим образом:

groups = []
groups[0] = ["hello", "goodbye"]
groups[1] = ["world", "everyone"]

combinations = groups[0].product(groups[1])

puts combinations.inspect 
# [["hello", "world"], ["hello", "everyone"], ["goodbye", "world"], ["goodbye", "everyone"]]

Как мог этот код работать, когда группы содержат переменное количество массивов?


person Ollie Glass    schedule 05.08.2010    source источник


Ответы (1)


person    schedule
comment
Вау, спасибо. Не могли бы вы или кто-нибудь объяснить, как это работает? - person Ollie Glass; 06.08.2010
comment
Объяснение того, что это на самом деле делает, тоже было бы полезно и, вероятно, привело бы к лучшему дизайну кода OP ... - person jtbandes; 06.08.2010
comment
@Ollie: Array#product может принимать несколько массивов в качестве аргументов, так что это просто groups[0].product(groups[1],groups[2],...) - person jtbandes; 06.08.2010
comment
Как это работает: product принимает любое количество массивов, которые вы применяете к нему, и дает декартово произведение получателя и всех аргументов. Оператор splat разворачивает массив в список аргументов, поэтому мы берем все массивы в groups, кроме первого, и передаем их в качестве аргументов в product. - person Chuck; 06.08.2010
comment
Одно замечание: если ваш массив groups действительно переменный, вы должны принять во внимание, когда он пуст и когда он имеет только 1 массив, иначе вы можете получить undefined method 'product' for nil:NilClass - person lightswitch05; 21.08.2013