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!