Como trabalhar com arrays em Ruby

Introdução

Um array é uma estrutura de dados que representa uma lista de valores, chamados de elementos. Arrays permitem que você armazene múltiplos valores em uma única variável. Em Ruby, arrays podem conter qualquer tipo de dados, incluindo números, strings e outros objetos Ruby. Isso pode condensar e organizar seu código, tornando-o mais legível e mantível. Todos os arrays são objetos com seus próprios métodos que você pode chamar, fornecendo uma maneira padronizada de trabalhar com conjuntos de dados.

Neste tutorial, você irá criar arrays, acessar os valores que eles contêm, adicionar, modificar e remover elementos em um array, e iterar pelos elementos em um array para resolver problemas mais complexos.

Criando um Array

Você começará olhando como criar arrays com mais detalhes. Como exemplo, aqui está uma lista de várias espécies de tubarões. Sem um array, você poderia armazená-los em variáveis individuais:

sharks.rb
shark1 = "Hammerhead"
shark2 = "Great White"
shark3 = "Tiger"

Esta abordagem é prolixa e pode se tornar rapidamente difícil de manter, pois não é muito flexível. Adicionar outro tubarão significa que você teria que adicionar e controlar uma variável adicional.

Se você usar um array, pode simplificar esses dados. Para criar um array em um programa Ruby, use colchetes: ([]), e separe os valores que deseja armazenar com vírgulas:

sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger"]

Em vez de criar três variáveis separadas, agora você tem uma variável que contém todos os três tubarões. Neste exemplo, você usou colchetes — [] — para criar uma matriz e separou cada entrada com uma vírgula. Se você tivesse que adicionar um tubarão adicional, adicionaria outro tubarão à matriz em vez de criar e gerenciar uma nova variável.

Você pode imprimir toda a matriz com o comando print, que exibirá o conteúdo da matriz:

print sharks
Output
["Hammerhead", "Great White", "Tiger"]

Se você quiser criar uma matriz onde cada entrada é uma única palavra, você pode usar a sintaxe %w{}, que cria uma matriz de palavras:

days = %w{Monday Tuesday Wednesday Thursday Friday Saturday Sunday}

Isto é equivalente a criar a matriz com colchetes:

days =  ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

No entanto, observe que o método %w{} permite que você pule as aspas e as vírgulas.

As matrizes são frequentemente usadas para agrupar listas de tipos de dados semelhantes, mas em Ruby, as matrizes podem conter qualquer valor ou uma mistura de valores. Isso inclui outras matrizes. Aqui está um exemplo de uma matriz que contém uma string, um valor nil, um inteiro e uma matriz de strings:

mixed_data.rb
record = [
    "Sammy",
    null,
    7,
    [
        "another",
        "array",
    ]
]

Agora você verá como acessar dados armazenados em matrizes.

Acessando Itens em Matrizes

Para acessar um item específico, ou elemento de uma matriz, você referencia seu índice, ou sua posição na matriz. Em Ruby, os índices começam em zero. Para recuperar o primeiro elemento de sua matriz sharks, você anexa o índice do elemento à variável usando colchetes angulares:

sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger"]

A matriz sharks tem três elementos. Aqui está uma explicação de como cada elemento na matriz sharks é indexado.

Hammerhead Great White Tiger
0 1 2

O primeiro elemento na matriz é Hammerhead, que está indexado em 0. O último elemento é Tiger, que está indexado em 2. A contagem começa com 0 nos índices, o que vai contra a intuição natural de começar a contar em 1, então é bom ter isso em mente até que se torne natural.

Nota: Pode ajudar a pensar no índice como um deslocamento, significando o número de lugares a partir do início da matriz. O primeiro elemento está no início, então seu deslocamento, ou índice, é 0. O segundo elemento está a um local de distância da primeira entrada na matriz, então seu deslocamento, ou índice, é 1.

Você pode descobrir quantos elementos há em uma matriz com o método length:

sharks.length
Output
3

Embora os índices de sharks comecem em 0 e vão até 2, a propriedade length retorna o número de elementos na matriz, que é 3. Não se preocupa com os índices de forma alguma.

Se você quisesse descobrir o número do índice de um elemento específico em uma matriz, como Tiger, use o método index():

print sharks.index("Tiger")
Output
2

Isto retorna o índice do primeiro elemento que contém esse texto. Se um número de índice não for encontrado, como para um valor que não existe, o console retornará nil:

print sharks.index("Whale")
Output
nil

Para obter o último elemento de um array em Ruby, use o índice -1:

print sharks[-1]
Output
"Tiger"

O Ruby também fornece os métodos first e last para obter os primeiros e últimos elementos sem usar índices:

puts sharks.first
puts sharks.last
Output
"Hammerhead" "Tiger"

Tentar acessar um índice que não existe retornará nil:

sharks[10]
Output
nil

Arrays podem conter outros arrays, chamados de arrays aninhados. Esta é uma maneira de modelar conjuntos de dados bidimensionais em um programa. Aqui está um exemplo de um array aninhado:

nested_array = [
    [
        "salmon",
        "halibut",
    ],
    [
        "coral",
        "reef",
    ]
]

Para acessar elementos em um array aninhado, você adicionaria outro número de índice correspondente ao array interno. Por exemplo, para recuperar o valor coral deste array aninhado, você usaria a seguinte declaração:

print nested_array[1][0];
Output
coral

Neste exemplo, você acessou o array na posição 1 da variável nested_array, que retornou o array ["coral", "reef"]. Você então acessou os elementos na posição 0 desse array, que era "coral".

Agora vamos ver como adicionar elementos a um array.

Adicionando Elementos a Arrays

Você tem três elementos em seu array sharks, que são indexados de 0 a 2:

sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger"]

Existem algumas maneiras de adicionar um novo elemento. Você pode atribuir um valor ao próximo índice, que neste caso seria 3:

sharks[3] = "Whale";

print sharks
Output
["Hammerhead", "Great White", "Tiger", "Whale"]

Este método é propenso a erros. Se você adicionar um elemento e acidentalmente pular um índice, ele criará um elemento nil no array.

sharks[5] = "Sand";

print sharks;
Output
["Hammerhead", "Great White", "Tiger", "Whale", nil, "Sand"]

A tentativa de acessar o elemento adicional no array retornará seu valor, que será nil:

sharks[4]
Output
nil

Encontrar o próximo índice disponível em um array é propenso a erros e leva tempo extra. Evite erros usando o método push, que adiciona um elemento ao final de um array:

sharks.push("Thresher")
print sharks
Output
["Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher"]

Você também pode usar a sintaxe << em vez do método push para adicionar um elemento ao final de um array:

sharks << "Bullhead"
Output
["Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher", "Bullhead"]

Para adicionar um elemento no início de um array, use o método unshift():

sharks.unshift("Angel")
print sharks
Output
["Angel", "Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher", "Bullhead"]

Agora que você sabe como adicionar elementos, vamos olhar para removê-los.

Removendo Elementos de Arrays

Para remover um elemento específico de um array, use os métodos delete ou delete_at. No array sharks, você criou um elemento de array nil anteriormente. Agora, você vai se livrar dele.

Primeiro, encontre sua posição no array. Você pode usar o método index para fazer isso:

print sharks.index(nil)
Output
4

Em seguida, use delete_at para remover o elemento no índice 4 e imprima o array:

sharks.delete_at(4)
print sharks
Output
["Angel", "Hammerhead", "Great White", "Tiger", "Whale", "Thresher", "Bullhead"]

O método delete remove elementos de uma matriz que correspondem ao valor fornecido. Use-o para remover Whale da matriz:

sharks.delete("Whale")
print sharks;
Output
["Angel", "Hammerhead", "Great White", "Tiger", "Thresher", "Bullhead"]

O método delete removerá todas as ocorrências do valor fornecido, portanto, se sua matriz tiver elementos duplicados, todos serão removidos.

O método pop removerá o último elemento de uma matriz:

sharks.pop
print sharks;
Output
["Angel", "Hammerhead", "Great White", "Tiger", "Thresher"]

Bullhead foi removido como o último elemento da matriz. Para remover o primeiro elemento da matriz, use o método shift:

sharks.shift
print sharks
Output
["Hammerhead", "Great White", "Tiger", "Thresher"]

Desta vez, Angel foi removido do início da matriz.

Usando os métodos pop e shift, você pode remover elementos do início e do final das matrizes. O uso de pop é preferível sempre que possível, pois os demais itens na matriz mantêm seus números de índice originais.

Os métodos delete_at, pop e shift alteram a matriz original e retornam o elemento deletado::

sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
deleted_at_element = sharks.delete_at(1)
popped_element = sharks.pop

puts "Deleted_at element: #{deleted_at_element}"
puts "Popped element: #{popped_element}"

puts "Remaining array: #{sharks}"
Output
Deleted_at element: Great White Popped element: Whale Remaining array: ["Hammerhead", "Tiger"]

Agora você conhece várias maneiras de remover elementos de uma matriz. Agora, vamos ver como modificar o elemento que você já possui.

Modificando Elementos Existentes em Matrizes

Para atualizar um elemento na matriz, atribua um novo valor ao índice do elemento usando o operador de atribuição, assim como você faria com uma variável regular.

Dado um novo array de tubarões, com "Hammerhead" no índice 0, você substituirá "Hammerhead" por "Angel":

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks[0] = "Angel"
print sharks;
Output
["Angel", "Great White", "Tiger", "Whale"]

Para garantir que você atualize o elemento correto, você pode usar o método index para localizar o elemento primeiro, assim como fez para encontrar o elemento que desejava excluir.

Agora, vamos ver como trabalhar com todos os elementos no array.

Iterando sobre Arrays

O Ruby fornece muitas maneiras de iterar sobre um array, e o método que você usa depende do tipo de trabalho que deseja realizar. Em seguida, exploraremos como iterar sobre um array e exibir cada um de seus elementos.

O Ruby fornece a sintaxe for..in:

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
for shark in sharks do
  puts shark
end

Para cada elemento no array sharks, o Ruby atribui esse elemento à variável local shark. Você pode então imprimir o valor do elemento usando puts.

Você não verá for..in com muita frequência. Os arrays do Ruby são objetos e fornecem o método each para trabalhar com elementos. O método each funciona de maneira semelhante ao for..in, mas tem uma sintaxe diferente:

each.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each do |shark|
  puts shark
end

O método each utiliza uma sintaxe que você verá frequentemente na programação Ruby. Ele recebe um bloco Ruby como argumento. Um bloco é algum código que será executado posteriormente no contexto do método. Neste caso, o código é puts shark. A palavra-chave shark, cercada pelos caracteres de tubo (|), é a variável local que representa o elemento no array que o bloco acessará. Ruby atribui o elemento a esta variável e executa o código no bloco. O método each repete este processo para cada elemento no array:

Output
Hammerhead Great White Tiger Whale

Quando o bloco é apenas uma única linha, frequentemente você verá desenvolvedores Ruby substituírem as palavras-chave do e end por chaves e condensarem toda a declaração em uma única linha:

each.rb
...
sharks.each {|shark| puts shark }

Isso produz os mesmos resultados, mas utiliza menos linhas de código.

O método each_with_index funciona de maneira semelhante, mas também fornece acesso ao índice do elemento no array. Este programa utiliza each_with_index para imprimir o índice e o valor de cada elemento:

each_with_index.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each_with_index do |shark, index|
  puts "The index is #{index}"
  puts "The value is #{shark}"
end

Para cada elemento no array, Ruby atribui o elemento à variável shark e o índice atual à variável index. Você pode então referenciar ambas as variáveis no bloco.

Output
The index is 0 The value is Hammerhead The index is 1 The value is Great White The index is 2 The value is Tiger The index is 3 The value is Whale

Você iterará frequentemente sobre os elementos em um array em seus próprios programas, como quando precisa exibir os itens de um banco de dados em um site, ou quando está lendo linhas de um arquivo e processando seu conteúdo.

Conclusão

Arrays são uma parte extremamente versátil e fundamental da programação em Ruby. Neste tutorial, você criou arrays e acessou elementos individuais. Você também adicionou, removeu e modificou elementos em um array. Finalmente, você explorou duas maneiras de iterar sobre um array e exibir seu conteúdo, que é usada como um método comum para exibir dados.

Aprenda sobre outros tipos de dados em Ruby lendo o tutorial Compreendendo Tipos de Dados em Ruby.

Source:
https://www.digitalocean.com/community/tutorials/how-to-work-with-arrays-in-ruby