Levando arrays a um outro nível com o novo método Enumerator::Product do Ruby 3.2
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
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.