Ejemplo con tres arrays de dos elementos cada uno para simplificar.
a = [ 'uno', 'dos' ]
b = [ 'tres', 'cuatro' ]
c = [ 'cinco', 'seis' ]
Supongamos que lo que vos querés es armar arrays con elementos de a,
b, y c, pero los de b son opcionales.
Lo primero, agregá un nil a b
b << nil
Ahora, si hacés a.product(b,c) te va a devolver
[["uno", "tres", "cinco"], ["uno", "tres", "seis"], ["uno", "cuatro",
"cinco"], ["uno", "cuatro", "seis"], ["uno", nil, "cinco"], ["uno",
nil, "seis"], ["dos", "tres", "cinco"], ["dos", "tres", "seis"],
["dos", "cuatro", "cinco"], ["dos", "cuatro", "seis"], ["dos", nil,
"cinco"], ["dos", nil, "seis"]]
Si te fijás, unos cuantos de esos tienen nil en el medio -- esos son
los que no llevan el elemento de b.
Así que lo pasás por compact para eliminar los nils:
a.product(b,c).map(&:compact)
Te va a devolver exactamente lo que querés


2009/10/6 Julian Porta <[email protected]>:
> Uh. No era para Lucas, sino para Nacho.
> perdonen por el quilombo
>
> 2009/10/6 Julian Porta <[email protected]>
>>
>> Perdón, Lucas, pero no termino de entender (empecé con ruby la semana
>> pasada)
>> Será mucha molestia si te pido que te extiendas un poco en el proceso que
>> describis?
>> Creo que entiendo la idea pero me pierdo en la implementación
>> Porta.
>>
>> 2009/10/6 Nacho Facello <[email protected]>
>>>
>>> 2009/10/6 Lucas Sallovitz <[email protected]>:
>>> > 2009/10/6 Porta <[email protected]>
>>> >>
>>> >> Buenas.
>>> >> Tengo un problemita que me esta trastornando y no le encuentro la
>>> >> vuelta.
>>> >>
>>> >
>>> > Algo así:
>>> >
>>> > arrays_obligatorios = { { }, { }, ... }
>>> > arrays_opcionales = { { }, { }, ...}
>>> >
>>> > n = arrays_opcionales.size ^ 2
>>> > i = de 0 a n
>>> >   arrays = arrays_obligatorios + arrays_opcionales.filter { el bit de i
>>> > correspondiente al índice es 1 }
>>> >   resultado << arrays.producto_cartesiano
>>>
>>> Yo usaría Array#product combinado con una pisadita para los
>>> opcionales: agregale a los opcionales un elemento nil.
>>> Después tenés a.product(b, c, d), y vas a tener los arrays armaditos,
>>> con un nil donde no va nada porque es opcional, y ahí le hacés un
>>> map(&:compact) y chau.
>>>
>>> --
>>> Nacho Facello
>>> :wq
>>> _______________________________________________
>>> Ruby mailing list
>>> [email protected]
>>> http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
>>
>
>
> _______________________________________________
> Ruby mailing list
> [email protected]
> http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
>
>



-- 
Nacho Facello
:wq
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a