我建议使用Array#product https://ruby-doc.org/core-2.4.0/Array.html#method-i-product.
[:a, :b].product [4,5]
这将产生您想要的输出。
irb(main):001:0> [:a, :b].product [4,5]
=> [[:a, 4], [:a, 5], [:b, 4], [:b, 5]]
irb(main):002:0>
如果你想要一个惰性排列生成器,我之前写过类似的东西。但我警告你,如果你有大量的排列需要计算,可能需要一段时间。您应该能够从前 40 - 45 行中获取您需要的内容这个文件 https://github.com/rk/werd/blob/master/grammartest.rb(无论如何,这个文件是一个实验)。
诀窍是使用 Ruby 1.9.2 构建枚举器来处理数组的数组。因此,您首先构建一个将无限循环遍历数组的枚举器,并在数组的数组枚举器中跟踪第一个输出集,并在第二次命中时结束循环。这是我能够弄清楚如何终止这样的循环的唯一方法。
def infinite_iterator(array)
Enumerator.new do |result|
loop do
array.cycle { |item| result << item }
end
end
end
def cartesian_iterator(data)
Enumerator.new do |result|
first = data.map { |p| p.next }
result << first
i = 1
parts = first.dup
loop do
parts[2-i] = data[2-i].next
break if parts == first
result << parts.join
i = ((i + 1) % parts.size)
end
end
end
array = [ infinite_iterator([:a,:b]), infinite_iterator([4,5]) ]
generator = cartesian_iterator(array)
generator.each { |a| p a }