Até a presente aula, a única forma que conhecemos para armazenar dados na memória é através de variáveis simples, conforme aprendemos na Aula 3. Nesta aula, iremos aprender a trabalhar com arrays, que são estruturas capazes de armazenar dados organizados numa sequência, e que nos fornecem métodos para que possamos manipular esses dados (SOUZA, 2012).
Observe a Figura 1, que mostra uma representação gráfica de uma variável chamada idade
e que armazena o valor 9
na memória do computador. Se for necessário armazenar outro valor, 10 por exemplo, será preciso criar uma outra variável para armazená-lo, pois, se tentarmos utilizar a mesma variável, perderemos o valor que está guardado nela.
Para armazenar vários valores, o indicado é utilizar um array, pois essa é uma estrutura capaz de armazenar um conjunto de valores sem a necessidade de criar várias variáveis. Observe a Figura 2, que ilustra uma representação gráfica de um array na memória do computador. Observe que o array é capaz de guardar vários valores com apenas uma referência para a memória (idades).
Para melhor ilustrar a estrutura de um array e como eles funcionam, observe a Figura 3.
Conforme já foi explicado anteriormente, o array é uma estrutura capaz de guardar um conjunto de valores. Cada valor é guardado numa posição do array e cada posição é endereçada (também chamamos de indexada) por um índice, que é um número inteiro que marca cada posição no array. Portanto, conforme ilustrado na Figura 3, o valor da posição 0 é 10, o valor da posição 1 é 14, o valor da posição 2 é 20, etc. O primeiro índice sempre será 0 (zero), portanto, num array com X posições, o último índice será sempre X - 1.
Em Ruby os arrays são dinâmicos, portanto você não precisa definir seu tamanho inicial, mas se preferir definir você também pode. Caso tenha criado um array com 10 posições e precise guardar um novo dado no array, você poderá fazê-lo sem problemas pois o array será expandido automaticamente conforme a necessidade.
Diferentemente de outras linguagens, em Ruby os arrays também podem guardar tipos de dados distintos. Portanto, você pode guardar uma String na primeira posição, um número inteiro na segunda, um número real na terceira, um objeto na quarta, etc.
Primeiramente, vamos aprender algumas formas de criar um array em Ruby. Para isso, abra o IRB, digite a primeira linha do Exemplo de código 1 e observe a resposta dada pelo IRB.
meu_array = Array.new
Digitando meu_array = Array.new
(atenção para o A maiúsculo de Array), estamos criando um novo array vazio e guardando-o na variável meu_array
. Sim, são as variáveis que guardam os arrays, que, por sua vez, são capazes de guardar um conjunto de valores. Vale salientar que o nome da variável é escolhido por você e deve obedecer às regras de nomenclatura de variáveis apresentadas na Aula 3.
Abra o IRB e crie um novo array vazio, conforme ilustrado no Exemplo de código 1.
O Exemplo de código 2 apresenta como criar um array com 10 posições utilizando Array.new
.
meu_array = Array.new(10)
Observe que a resposta dada pelo IRB indica que foi criado um novo array com 10 posições, na qual cada uma possui o valor nil
(nulo).
Abra o IRB e crie um novo array vazio com cinco posições usando Array.new
, conforme ilustrado no Exemplo de código 2.
Outra forma de criar um array é ilustrada no Exemplo de código 3.
meu_array = []
Atribuindo []
a uma variável estamos criando um novo array vazio.
Abra o IRB e crie um novo array vazio usando []
, conforme ilustrado no Exemplo de código 3.
Utilizando essa mesma sintaxe podemos criar um array com valores iniciais, conforme apresenta o Exemplo de código 4.
meu_array = [10, 20, 30, 40, 50]
Observe, na resposta do IRB, que foi criado um novo array com os valores definidos na primeira linha.
Abra o IRB e crie um array com valores iniciais quaisquer, conforme ilustrado no Exemplo de código 4.
Conforme explicado anteriormente, os arrays em Ruby permitem guardar diferentes tipos de dados. Confira essa situação no Exemplo de código 5.
meu_array = [10, "vinte", true, nil, 3.14]
No exemplo anterior, criamos um array com cinco posições: a primeira contém um número inteiro, a segunda contém uma String, a terceira contém um valor booleano, a quarta contém um nulo e a quinta contém um número real.
Abra o IRB e crie um novo array com valores iniciais quaisquer, mas sendo de tipos diferentes, conforme ilustra o Exemplo de código 5.
Agora vamos aprender como guardar valores e acessar valores em um array. Existem pelo menos duas formas de se adicionar valores a um array: você pode especificar uma posição (índice) do array para guardar o novo valor ou usar a próxima posição disponível. Inicialmente vamos aprender como guardar um valor no array usando a próxima posição disponível.
Para melhor ilustrar, vamos utilizar como exemplo o array apresentado no Exemplo de código 4, que é apresentado graficamente abaixo.
10 | 20 | 30 | 40 | 50 |
---|---|---|---|---|
0 | 1 | 2 | 3 | 4 |
O array que estamos usando como exemplo possui cinco posições, e todas elas já estão ocupadas com valores. Portanto, qual é a próxima posição disponível nesse array? A posição com índice 5! Lembre-se que os arrays em Ruby são automaticamente expansíveis, portanto você pode adicionar novos valores mesmo que não haja posições vazias.
Observe o Exemplo de código 6, que ilustra como adicionar um novo valor ao array.
meu_array << 60
Conforme ilustrado no Exemplo de código 6, o operador <<
permite a adição de um novo valor ao array. Esse novo valor será adicionado na próxima posição disponível, que nesse caso é a sexta posição (índice 5). Observe a resposta do IRB que mostra que o novo valor foi adicionado no final do array (índice 5).
Abra o IRB, crie um array com valores iniciais quaisquer e adicione um novo elemento usando o operador <<
, conforme ilustrado no Exemplo de código 6.
A segunda forma que iremos apresentar para adicionar novos elementos a um array é aquela em que o novo elemento é colocado numa posição (índice) específica. Observe como fazer isso no Exemplo de código 7.
meu_array = [10, 20, 30, 40, 50, 60]
meu_array[0] = "dez"
# ["dez", 20, 30, 40, 50, 60]
Observe, no Exemplo de código 7, que estamos usando o mesmo array produzido no exemplo anterior. Para adicionar um elemento numa posição específica do array, basta definir o índice entre [
e ]
, conforme ilustrado na linha 3. Nesse exemplo, adicionamos "dez" na primeira posição (índice 0) do array, substituindo o valor que havia nessa posição.
Abra o IRB, crie um array com valores iniciais quaisquer e adicione um novo elemento numa posição específica, conforme ilustrado no Exemplo de código 7.
Para acessar valores armazenados em um array, basta usar o nome da variável que guarda o array, seguido do índice da posição que se deseja acessar entre [
e ]
. Observe, no Exemplo de código 8, como acessar o valor armazenado na segunda posição (índice 1).
meu_array = ["dez", 20, 30, 40, 50, 60]
meu_array[1] # 20
Caso você acesse uma posição que não guarda valor algum, o resultado será nil
.
Abra o IRB, crie um array com valores iniciais quaisquer e depois acesse uma posição qualquer do array, conforme ilustrado no Exemplo de código 8.
Existem alguns métodos e operadores que auxiliam a manipulação de dados em arrays. Nesta seção, iremos apresentar apenas alguns deles, mas você pode obter maiores informações sobre eles e sobre outros métodos e operadores na página oficial da documentação do Ruby: http://docs.ruby-lang.org/en/2.0.0/Array.html (em inglês).
Para ilustrar os métodos e operadores auxiliares, iremos utilizar os dois arrays apresentados no Exemplo de código 9.
array1 = [1, 2, 3]
array2 = [3, 4, 5]
O operador &
, ilustrado no Exemplo de código 9, retorna (dá como resultado) um novo array contendo os elementos em comum nos dois arrays (array1
e array2
), sem duplicatas.
array1 & array2
# [3]
O operador +
, ilustrado no Exemplo de código 11, retorna um novo array produzido pela concatenação (união) dos dois arrays (array1
e array2
).
array1 + array2
# [1, 2, 3, 3, 4, 5]
O operador -
, ilustrado no Exemplo de código 12, retorna uma cópia do array1
removendo os elementos que também constam no array2
.
array1 - array2
# [1, 2]
O operador ==
, ilustrado no Exemplo de código 13, irá retornar verdadeiro caso o array1
e o array2
tenham a mesma quantidade de elementos e se cada elemento do array1
for igual ao seu correspondente (mesma posição) no array2
.
array1 == array2
# false
O método clear
, ilustrado no Exemplo de código 14, remove todos os elementos do array1
.
array1.clear
# []
O método delete
, ilustrado no Exemplo de código 15, recebe um elemento como parâmetro e o remove do array. O método irá retornar o próprio valor removido ou nil
caso o elemento passado como parâmetro não seja encontrado no array.
array1.delete(1)
# 1
O método delete_at
, ilustrado no Exemplo de código 16, recebe um índice (número inteiro) como parâmetro e remove o elemento armazenado naquela posição. O método irá retornar o valor removido ou nil
caso o índice passado como parâmetro esteja fora das dimensões do array.
array2.delete_at(1)
# 4
O método empty?
, ilustrado no Exemplo de código 17, irá retornar verdadeiro caso o array esteja vazio e falso caso contrário.
array1.empty?
# false
O método include?
, ilustrado no Exemplo de código 18, recebe um elemento como parâmetro e retorna verdadeiro caso esse elemento esteja presente dentro do array, e falso caso contrário.
array1.include?(1)
# true
O método size
, ilustrado no Exemplo de código 19, retorna o número de elementos armazenados no array.
array2.size
# 3
É muito comum, em diversas situações, precisarmos iterar, ou seja, verificar cada um dos elementos de um array, e fazer algum processamento se for necessário. Nesta seção, iremos apresentar como iterar entre os elementos de um array usando alguns dos laços já apresentados em aulas anteriores.
Confira o Exemplo de código 20 que ilustra como iterar entre os elementos de um array usando o each
.
meu_array = [10, 20, 30, 40, 50]
meu_array.each do |elemento|
puts elemento
end
Crie um script em Ruby com o código apresentado no Exemplo de código 20, execute-o e observe o resultado.
Na linha 1, criamos um array com cinco elementos numéricos quaisquer. Na linha 3, usamos o método each
no meu_array
para que possamos iterar entre seus elementos. A cada iteração do laço, um dos valores armazenados no meu_array
será atribuído à variável elemento
(definida entre |
e |
). Portanto, nesse caso, na primeira iteração, o valor de elemento
será 10
; na segunda iteração, o valor de elemento
será 20
; na terceira iteração, o valor de elemento
será 30
, e assim sucessivamente, até que a variável elemento
tenha assumido o valor de cada posição do meu_array
. Vale salientar que, o nome da variável elemento
é definido pelo próprio programador, obedecendo as normas de nomenclatura de variáveis.
Outra forma de iterar entre os elementos de um array usando o método each
é passando um bloco de código através de chaves ({
e }
), conforme ilustra o Exemplo de código 21.
meu_array = [10, 20, 30, 40, 50]
meu_array.each { |elemento|
puts elemento
}
Crie um script em Ruby com o código apresentado no Exemplo de código 21, execute-o e observe o resultado.
Novamente o nome da variável auxiliar é definido entre |
e |
, contudo, ao invés de usar o do
e o end
como marcadores de início e fim do bloco de código, estamos usando as chaves ({
e }
). A variável elemento
irá assumir cada valor armazenado no meu_array
. Outra forma de iterar entre os elementos de um array é usando a instrução for
, conforme ilustra o Exemplo de código 22.
meu_array = [10, 20, 30, 40, 50]
for elemento in meu_array
puts elemento
end
Crie um script em Ruby com o código apresentado no Exemplo de código 22, execute-o e observe o resultado.
Usando o for
, o nome da variável auxiliar é definido logo após o for
e o nome da variável que guarda o array é colocado após o in
. No Exemplo de código 22, a variável elemento
irá assumir cada um dos valores armazenados no meu_array
.
POINT, T. Ruby Tutorial. Tutorials Point. 2015. Disponivel em: http://www.tutorial-spoint.com/ruby/. Acesso em: 12 nov. 2015.
RANGEL, E. Conhecendo Ruby. [S.l.]: Leanpub, 2014.
RUBY LANG. Class Array. Ruby Documentation. 2015. Disponivel em: http://docs.ruby-lang.org/en/2.0.0/Array.html. Acesso em: 04 fev. 2016.
SOUZA, L. Ruby: aprenda a programar na linguagem mais divertida. 1. ed. São Paulo: Casa do Código, 2012. v. I.