Sugiero usar Array#product
.
[:a, :b].product [4,5]
Lo que producirá la salida que desee.
irb(main):001:0> [:a, :b].product [4,5]
=> [[:a, 4], [:a, 5], [:b, 4], [:b, 5]]
irb(main):002:0>
Si usted quiere un generador perezoso de permutaciones, he escrito algo como esto antes. Pero te advierto, si tienes una gran cantidad de permutaciones para calcular, puede llevar un tiempo. Debería poder tomar lo que necesita de las primeras 40 a 45 líneas de this file (este archivo fue un experimento de todos modos).
El truco consiste en crear enumeradores con Ruby 1.9.2 para abrirse camino en una matriz de matrices. Por lo tanto, primero crea un enumerador que recorrerá un ciclo interminable, y en su enumerador array-of-array rastrea el primer conjunto de resultados y termina el ciclo cuando se golpea por segunda vez. Esta era la única forma en que podía descubrir cómo terminar ese ciclo.
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 }
¿Puede aclarar lo que está pidiendo? ¿Cómo deberías construir qué? ¿Estás tratando de crear una clase llamada 'CartesianProduct' que haría lo que se muestra? – denniss
Sí, requiere un método de clase. Sé cómo construir un método de instancia para devolver un valor, pero no sé cómo construir el método de clase para modificar el valor de un objeto de clase. – ZhijieWang
¿Es esta tarea? Si es así, está bien, la gente intentará empujarte en la dirección correcta. – steenslag