Levando arrays a um outro nível com o novo método Enumerator::Product do Ruby 3.2

Morgana Borges
Brazilians in Tech
Published in
2 min readFeb 6, 2023

Já pensou em facilitar seu código com o método Enumerator::Product do Ruby 3.2? Vou te mostrar várias formas de elevar sua experiência na linguagem, então vem comigo!

Texto escrito por Morgana Borges

Fonte: Disponibilizada pela autora

O Ruby 3.2 traz uma nova feature que permite combinar — de um jeito bem simples e prático — elementos de vários arrays ou objetos enumeráveis. O método Enumerator::Product, pode ser útil quando se trabalha com grandes conjuntos de dados ou ao gerar combinações.

Por exemplo, digamos que você tenha dois arrays:

massas = ["ravioli", "linguine", "penne"]
molhos = ["marinara", "bolonhesa", "pesto"]

Usando o método product, você consegue gerar todas as combinações possíveis de massas e molhos, assim:

¬massas.to_enum.product(molhos).to_a
=> [["ravioli", "marinara"], ["ravioli", "bolonhesa"], ["ravioli", "pesto"],
["linguine", "marinara"], ["linguine", "bolonhesa"], ["linguine", "pesto"],
["penne", "marinara"], ["penne", "bolonhesa"], ["penne", "pesto"]]

Você também pode adicionar mais arrays ao product para gerar combinações ainda mais complexas. Por exemplo, digamos que você também tenha um array de coberturas:

¬coberturas = ["queijo ralado", "azeite de oliva"]

Você pode gerar todas as combinações possíveis de massas, molhos e coberturas, dessa forma:

¬massas.to_enum.product(molhos, coberturas).to_a
=> [["ravioli","marinara","queijo ralado"], ["ravioli","marinara","azeite de oliva"],
["ravioli","bolonhesa","queijo ralado"], ["ravioli","bolonhesa","azeite de oliva"],
["ravioli","pesto","queijo ralado"], ["ravioli","pesto","azeite de oliva"],
["linguine","marinara","queijo ralado"], ["linguine","marinara","azeite de oliva"],
["linguine","bolonhesa","queijo ralado"], ["linguine","bolonhesa","azeite de oliva"],
["linguine","pesto","queijo ralado"], ["linguine","pesto","azeite de oliva"],
["penne","marinara","queijo ralado"], ["penne","marinara","azeite de oliva"],
["penne","bolonhesa","queijo ralado"], ["penne","bolonhesa","azeite de oliva"],
["penne","pesto","queijo ralado"], ["penne","pesto","azeite de oliva"]]

Outro uso do método product é em combinação com outros métodos Enumerator. Por exemplo, você pode usar o método Enumerator#map para aplicar uma transformação em cada combinação gerada pelo product:

¬massas.to_enum.product(molhos).map { |massa, molho| "#{massa} #{molho}" }.to_a
=> ["ravioli marinara", "ravioli bolonhesa", "ravioli pesto", "linguine marinara", "linguine bolonhesa", "linguine pesto", "penne marinara", "penne bolonhesa", "penne pesto"]

Você também pode usar o método product com um bloco, realizando assim operações em cada combinação. Por exemplo, você pode usá-lo para gerar todas as combinações possíveis de massas e molhos e, em seguida, usar um bloco para verificar se alguma combinação corresponde a alguma condição:

¬massas.to_enum.product(molhos).any? { |massa, molho| massa == "ravioli" && molho == "pesto" }
=> true

E com essas diversas formas, o novo método Enumerator::Product pode ser uma ferramenta extremamente útil para elevar sua experiência ao trabalhar com arrays.

Para saber mais sobre mim acesse:

LinkedIn: https://www.linkedin.com/in/morganatborges/

Instagram: @morganaborges_

Migrei para a área de tecnologia durante a pandemia em busca de liberdade geográfica e uma profissão ‘lifelong learning’. Hoje sou nômade digital e desenvolvedora Ruby on Rails. Antes disso, fui barista e fazer uma xícara de café me motiva a encarar ‘aquele’ código.

--

--