Em Ruby, um array (a que também se chama vetor) é uma coleção ordenada de qualquer objeto, indexada por números inteiros.
A indexação de arrays começa em 0.
Um índice negativo é considerado relativo ao fim do array. Por exemplo, um índice de -1 indica o último elemento do array, -2 é o penúltimo elemento, e assim por diante.
Normalmente, os arrays criam-se com a notação [].
Podem conter objetos de qualquer tipo.
array = [1, "two", 3.0]
Os elementos de um array podem ser obtidos através dos seus índices com o método #[].
Isto devolve o elemento no índice indicado, ou devolve um subarray que começa no índice inicial e se prolonga por um comprimento especificado.
Os índices negativos contam a partir do fim do array.
a = [ "a", "b", "c", "d", "e" ]
a[2] #=> "c"
a[6] #=> nil
a[1, 3] #=> [ "b", "c", "d" ]
a[-1] #=> "e"
a[-2] #=> "d"
a[-3, 2] #=> ["c", "d"]
Há muitos métodos auxiliares úteis nos arrays. Aqui ficam alguns dos mais comuns:
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
fibonacci.size #=> 8
fibonacci.sum #=> 33
fibonacci.reverse #=> [13, 8, 5, 3, 2, 1, 1, 0]
Em vez de usar ciclos para percorrer coleções, em Ruby usamos a enumeração.
A enumeração é o ato de percorrer uma coleção (neste caso, um array) e realizar alguma ação sobre cada objeto. A enumeração é um conceito fundamental em Ruby e é usada para coisas como ordenar, agrupar, mapear, reduzir e muito mais.
Uma enumeração para imprimir cada palavra de um array seria assim:
words = ["the", "cat", "sat"]
words.each do |word|
puts word
end
# Output:
# the
# cat
# sat
Neste exemplo, chamámos o método .each ao nosso array e passámos um bloco que recebe um parâmetro (word) e o imprime.
Vamos ver os blocos com muito mais detalhe mais adiante no percurso, mas por agora pensa neles como funções anónimas que podem receber zero ou mais argumentos.
Podem ser definidos com a sintaxe do...end (acima) ou com a sintaxe {} (abaixo).
Aqui ficam outros exemplos de métodos de arrays que usam blocos:
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
fibonacci.count { |number| number == 1 } #=> 2
fibonacci.any? { |number| number == 6 } #=> false
fibonacci.select { |number| number.odd? } #=> [1, 1, 3, 5, 13]
fibonacci.all? { |number| number < 20 } #=> true
fibonacci.map { |number| number * 2 } #=> [0, 2, 2, 4, 6, 10, 16, 26]
És um observador de aves entusiasta que regista quantas aves visitaram o teu jardim nos últimos sete dias.
Tens cinco tarefas, todas relacionadas com o número de aves que visitaram o teu jardim.
Para efeitos de comparação, guardas sempre por perto uma cópia das contagens da semana passada, que foram: 0, 2, 5, 3, 7, 8 e 4. Implementa o método BirdCount.last_week, que devolve as contagens da semana passada:
BirdCount.last_week
# => [0, 2, 5, 3, 7, 8, 4]
Implementa o método BirdCount#yesterday para devolver quantas aves visitaram o teu jardim ontem. As contagens de aves estão ordenadas por dia: o primeiro elemento é a contagem do dia mais antigo e o último é a contagem de hoje.
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.yesterday
# => 4
Implementa o método BirdCount#total para devolver o número total de aves que visitaram o teu jardim:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.total
# => 19
Alguns dias são mais movimentados do que outros. Um dia movimentado é aquele em que cinco ou mais aves visitaram o teu jardim.
Implementa o método BirdCount#busy_days para devolver o número de dias movimentados:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.busy_days
# => 2
Implementa o método BirdCount#day_without_birds? que devolve true se houve um dia em que zero aves visitaram o jardim; caso contrário, devolve false:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.day_without_birds?
# => true
Inscreve-te no Exercism para aprenderes e dominares Ruby com 21 conceitos121 exercícios, e mentoria humana real, tudo grátis.