Все возможные комбинации из хэша массивов в Ruby

Что у меня есть:

Допустим, у меня есть вот такой хэш с разными значениями, принадлежащими одному параметру.

a = {}
a[:bitrate] = ["100", "500", "1000"]
a[:fps] = ["15", "30"]
a[:qp] = ["20", "30"]

Что мне нужно:

Мне нужен способ итеративно получить всевозможные комбинации этих значений, то есть со всеми парами параметр/значение:

  • битрейт = 100, fps = 15, qp = 20
  • битрейт = 500, fps = 15, qp = 30
  • ...

Количество параметров (т.е. ключей) и количество значений (т.е. длина массивов значений) заранее неизвестны. В идеале я бы сделал что-то вроде:

a.foo do |ret|
  puts ret.keys   # => ["bitrate", "fps", "qp"]
  puts ret.values # => ["100", "15", "20"]
end

… где блок вызывается для каждой возможной комбинации. Как определить foo?


Что мне (вероятно) не нужно:

Теперь я знаю это: Объединить массив массива во все возможные комбинации, только вперед, в Ruby, предлагая что-то вроде:

a.first.product(*a[1..-1]).map(&:join)

Но это работает только со значениями и массивами в массивах, и мне нужна исходная ссылка на имя параметра.

19
задан Community 23 May 2017 в 11:47
поделиться