07. Arrays e Iteradores

Vamos escrever um programa que nos permita digitar quantas palavras quisermos (uma por linha, até pressionarmos Enter em uma linha vazia), e depois mostre as palavras em ordem alfabética? Tente escrever esse programa...

...

Conseguiu? Você provavelmente teve problemas. Como guardar todas as palavras que o usuário digitou? Você não sabe quantas serão. Você não pode simplesmente criar um monte de variáveis (palavra1, palavra2, etc.), porque o usuário pode digitar mais palavras do que você previu.

Precisamos de uma maneira de guardar uma lista de coisas, sem saber quantas coisas são. Precisamos de Arrays (Vetores).

Um array é apenas uma lista no seu computador. Cada slot na lista age como uma variável: você pode ver qual objeto um determinado slot aponta, e você pode fazê-lo apontar para um objeto diferente. Vamos criar um array:

[]
[5]
['Olá', 'Adeus']

sabor = 'baunilha'
[89.9, sabor, [true, false]]

Primeiro temos um array vazio, depois um array com um único número, depois um com duas strings. Em seguida, temos uma atribuição de variável simples; depois um array com três objetos: um float, a variável sabor, e outro array.

Para nos ajudar a encontrar coisas em arrays, cada slot recebe um número de índice. Programadores (e a maioria das linguagens de programação, incluindo Ruby) começam a contar do zero, então o primeiro slot no array é o slot zero.

nomes = ['Ada', 'Belle', 'Chris']

puts nomes
puts nomes[0]
puts nomes[1]
puts nomes[2]
puts nomes[3]  # Este está fora do alcance.
Ada
Belle
Chris
Ada
Belle
Chris
nil

Vemos que puts nomes imprime cada nome no array nomes. Então usamos nomes[0] para ver o que está no "slot zero", nomes[1] para o "slot um", e assim por diante. Quando tentamos nomes[3], o Ruby nos deu nil. nil é o jeito do Ruby dizer "nada". Quando você tenta acessar um slot que não existe, você recebe nil.

O Método each

each (cada) nos permite fazer algo para cada objeto que o array aponta. Se quisermos dizer algo legal sobre cada linguagem em um array, faríamos assim:

linguagens = ['English', 'Norwegian', 'Ruby']

linguagens.each do |lang|
  puts 'Eu gosto de ' + lang + '!'
  puts 'Você gosta?'
end

puts 'E vamos ouvir o que temos para C++!'
puts '...'
Eu gosto de English!
Você gosta?
Eu gosto de Norwegian!
Você gosta?
Eu gosto de Ruby!
Você gosta?
E vamos ouvir o que temos para C++!
...

O que aconteceu aqui? linguagens.each é um método que age como um loop. O código entre do e end é executado para cada item no array. A parte |lang| é como damos um nome ao objeto atual (o objeto para o qual each está apontando naquele momento). Na primeira vez, lang aponta para 'English', na segunda para 'Norwegian', e assim por diante.

Isso é chamado de Iterador. Iteradores são como loops, mas são métodos que agem sobre listas de coisas.

Mais Métodos de Array

Aprendemos [], each e length (que funciona em arrays assim como em strings). Também temos join, push, pop e sort.

join (juntar) pega um array de strings e as junta em uma única string:

alimentos = ['alcachofra', 'brioche', 'caramelo']

puts alimentos
puts
puts alimentos.to_s
puts
puts alimentos.join(', ')
puts
puts alimentos.join('  :)  ') + '  8)'
alcachofra
brioche
caramelo

["alcachofra", "brioche", "caramelo"]

alcachofra, brioche, caramelo

alcachofra  :)  brioche  :)  caramelo  8)

push (empurrar) e pop (estourar/tirar) são opostos. push adiciona um objeto ao final do array, e pop remove o último objeto do array (e diz a você qual objeto era).

favoritos = []
favoritos.push 'chuva na janela'
favoritos.push 'uísque em gatinhos'

puts favoritos[0]
puts favoritos.last
puts favoritos.length

puts favoritos.pop
puts favoritos
puts favoritos.length
chuva na janela
uísque em gatinhos
2
uísque em gatinhos
chuva na janela
1

Umas Coisinhas Para Tentar

  • Escreva o programa que pedimos no começo deste capítulo. Dica: existe um método adorável para arrays chamado sort (ordenar). Use-o!
  • Tente escrever o programa acima sem usar o método sort. Uma boa parte da programação é resolver problemas de ordenação.
  • Reescreva seu programa de Tabela de Conteúdo (do capítulo sobre métodos). Comece o programa com um array contendo todas as informações da tabela (nomes dos capítulos, números das páginas, etc.). Depois imprima tudo em um loop formatado.

Agora que aprendemos sobre arrays e iteradores, estamos prontos para começar a escrever nossos próprios métodos!