Aula 10 - Arrays

Introdução

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.

Representação gráfica de uma variável na memória
Figura 1 - Representação gráfica de uma variável na memória

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).

Representação gráfica de um array na memória
Figura 2 - Representação gráfica de um array na memória

Para melhor ilustrar a estrutura de um array e como eles funcionam, observe a Figura 3.

Estrutura de um array
Figura 3 - Estrutura de um array

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.

Arrays em Ruby

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.

Criando um Array

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
  

Exemplo de código 1 - Criando um array em Ruby

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.

Atividade 10.1

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)
  

Exemplo de código 2 - Criando um array com 10 posições

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).

Atividade 10.2

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 = []
  

Exemplo de código 3 - Criando um array

Atribuindo [] a uma variável estamos criando um novo array vazio.

Atividade 10.1

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]
  

Exemplo de código 4 - Criando um array

Observe, na resposta do IRB, que foi criado um novo array com os valores definidos na primeira linha.

Atividade 10.4

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]
  

Exemplo de código 5 - Criando um array em Ruby

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.

Atividade 10.5

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.

Guardando valores no array

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
  

Exemplo de código 6 - Adicionando um novo elemento na próxima posição disponível

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).

Atividade 10.6

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]
  

Exemplo de código 7 - Adicionando um novo elemento numa posição específica

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.

Atividade 10.7

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.

Acessando valores do array

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
  

Exemplo de código 8 - Acessando valores armazenados no array

Caso você acesse uma posição que não guarda valor algum, o resultado será nil.

Atividade 10.8

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.

Métodos e operadores auxiliares

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]
  

Exemplo de código 9 - Arrays que serão usados como exemplo

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]
  

Exemplo de código 10 - Operador &

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]
  

Exemplo de código 11 - Operador +

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]
  

Exemplo de código 12 - Operador -

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
  

Exemplo de código 13 - Operador ==

O método clear, ilustrado no Exemplo de código 14, remove todos os elementos do array1.

  
    array1.clear
    # []
  

Exemplo de código 14 - Método 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
  

Exemplo de código 15 - Método delete

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
  

Exemplo de código 16 - Método delete_at

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
  

Exemplo de código 17 - Método empty?

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
  

Exemplo de código 18 - Método include?

O método size, ilustrado no Exemplo de código 19, retorna o número de elementos armazenados no array.

  
    array2.size
    # 3
  

Exemplo de código 19 - Método size

Iterando em arrays

É 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
  

Exemplo de código 20 - Iterando entre os elementos do array com each

Atividade 10.9

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
    }
  

Exemplo de código 21 - Iterando entre os elementos do array com each e bloco de código

Atividade 10.10

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
  

Exemplo de código 22 - Iterando entre os elementos do array com for

Atividade 10.11

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.

Referências

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.