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.