Indo um pouco além do básico com arrays em Ruby

Dicas - 07/Fev/2021 - por Marcus Pereira

Manipular Arrays é uma tarefa comum no dia a dia de quem trabalha com desenvolvimento de software. Vamos demonstrar algumas maneiras de interagir com dados de Arrays em Ruby usando como exemplo um baralho de cartas. Um baralho completo possui:

  • 52 cartas
  • 04 naipes
  • Um ás (representado pela letra A)
  • 13 cartas para cada naipe
  • 03 dessas cartas contêm figuras como: Rei, Rainha e Valete.

Para criar um array contendo os números de 2 a 10, um ás (A) e 3 figuras J (Valete), Q (Rainha), K (Rei), podemos executar:

irb#1(main):001:0> ranks = (2..10).to_a + %w[J Q K A]
# => [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"]

Perceba que usamos o .to_a para transformar um objeto da classe Range em Array! :)

irb(main):005:0> (2..10).class
=> Range
irb(main):006:0> (2..10).to_a.class
=> Array

O %w é uma sintaxe mais simples para se criar um array. Isso evita ficar escrevendo vírgulas para separar os itens dos arrays. Leia mais sobre isso, neste artigo.

Agora, podemos criar o nosso array de naipes:

suits = %w[spades diamonds clubs hearts]
# saída: ["spades", "diamonds", "clubs", "hearts"]

E para finalizar. Podemos usar um método da classe Array chamado product para gerar as combinações entre os arrays de ranks e suits. Em nosso caso, o array chama o método product no array ranks passando o suits como parâmetro.

cards = ranks.product(suits)

Agora podemos fazer coisas incríveis, como verificar quantas cartas existem dentro do baralho usando o método size.

irb(main):011:0> cards.size
=> 52

Podemos pegar a primeira carta de um baralho usando o first:

irb(main):012:0> cards.first
=> [2, "spades"]

Para obter as 5 primeiras cartas do baralho podemos passar um argumento ao método first:

irb(main):018:0> cards.first(5)
=> [["K", "spades"], [7, "spades"], ["Q", "clubs"], [10, "diamonds"], ["Q", "diamonds"]] # continua ...

Para obter as 3 últimas cartas do baralho, é possível usar o last:

irb(main):013:0> cards.last(3)
=> [["A", "diamonds"], ["A", "clubs"], ["A", "hearts"]]

Use o reverse! para inverter o baralho:

irb(main):014:0> cards.reverse!
=> [["A", "hearts"], ["A", "clubs"], ["A", "diamonds"], ["A", "spades"], ["K", "hearts"]] # continua ...

O método shuffle embaralha as cartas aleatoriamente:

irb#1(main):0015:0> cards.shuffle!
=> [["K", "spades"], [7, "spades"], ["Q", "clubs"], [10, "diamonds"], ["Q", "diamonds"], ["Q", "spades"], [8, "spades"], [7, "diamonds"], [7, "hearts"]] # continua ...

Podemos pegar somente as cartas que possuem o naipe de espadas em nosso baralho utilizando o select:

irb(main):035:0> cards.select {|c| c.include? "spades" }
=> [["K", "spades"], [7, "spades"], ["Q", "spades"], [8, "spades"], [2, "spades"], ["A", "spades"], [4, "spades"]], # continua ...

Você pode usar o include? para verificar se o 3 de espadas existe no baralho:

rb(main):039:0> cards.include? [3, "spades"]
=> true

Use a sua criatividade para fazer mais coisas com o baralho.

Foto de perfil do autor
Marcus Pereira

Dev

Desenvolvedor, gosta de ler e apaixonado por mergulho. Gosta de falar sobre o mundo da tecnologia e ama dogs =)