假设我有这样的哈希值,各种值属于一个参数.
a = {}
a[:bitrate] = ["100", "500", "1000"]
a[:fps] = ["15", "30"]
a[:qp] = ["20", "30"]
Run Code Online (Sandbox Code Playgroud)
我需要一些方法来迭代地获得这些值的所有可能组合,因此,使用所有参数/值对:
bitrate = 100,fps = 15,qp = 20bitrate = 500,fps = 15,qp = 30参数的数量(即键)和值的数量(即值阵列的长度)事先是未知的.理想情况下,我会做以下事情:
a.foo do |ret|
puts ret.keys # => ["bitrate", "fps", "qp"]
puts ret.values # => ["100", "15", "20"]
end
Run Code Online (Sandbox Code Playgroud)
...为每个可能的组合调用块.我该如何定义foo?
现在,我知道这一点:将数组数组合成所有可能的组合,仅在Ruby中转发,建议类似于:
a.first.product(*a[1..-1]).map(&:join)
Run Code Online (Sandbox Code Playgroud)
但是这只对数组中的值和数组进行操作,我需要对参数名称的原始引用.
我在Ruby中有以下多维数组:
[[1,2], [3], [4,5,6]]
Run Code Online (Sandbox Code Playgroud)
我需要输出以下内容:
[[1,3,4], [1,3,5], [1,3,6], [2,3,4], [2,3,5], [2,3,6]]
Run Code Online (Sandbox Code Playgroud)
我试过创建一个递归函数,但我运气不好.
是否有任何Ruby功能可以帮助解决这个问题?或者是递归执行它的唯一选择?
谢谢
是否有一种更简单,更清晰的方式来编写这样的代码:
(1..10).each do |i|
(1..10).each do |j|
(1..10).each do |k|
(1..10).each do |l|
puts "#{i} #{j} #{k} #{l}"
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
理想情况下,我可以做...
(1..10).magic(4) { |i, j, k, l| puts "#{i} #{j} #{k} #{l}" }
Run Code Online (Sandbox Code Playgroud)
甚至更好......
magic(10, 4) { |i, j, k, l| puts "#{i} #{j} #{k} #{l}" }
Run Code Online (Sandbox Code Playgroud)
如果没有内置的东西,我怎么写一个类似上一个的方法?