Array é uma estrutura de dados mutável que armazena uma coleção de elementos de um tipo específico. Um array é uma estrutura de dados indexável. O fato de arrays serem mutáveis significa que, se um método que modifica o array for chamado nele, o array será modificado. Ou seja, ele não cria um novo array, e sim modifica o que já existe.
Para criar um array, use a sintaxe de literal de array ([]) e, dentro dela, especifique os elementos do array separados por vírgula.
[1, 2, 3] # => [1, 2, 3]
O Crystal infere o tipo do array a partir dos elementos.
[1, 2, 3].class # => Array(Int32)
Apesar de termos dito antes que arrays são uma coleção de elementos de um tipo específico, você pode criar um array com vários tipos usando tipos de união. Isso permite que o array contenha elementos de qualquer um dos tipos especificados no tipo de união. O Crystal infere o tipo do array a partir dos elementos.
[1, "2", 3.0] # => [1, "2", 3.0]
[1, "2", 3.0].class # => Array(Int32 | Float64 | String)
Um array multidimensional é um array de arrays.
Isso significa que cada elemento do array é ele próprio um array.
Isso pode ser útil quando você quer armazenar dados em formato de tabela.
Para definir um array multidimensional, você pode escrever um literal de array de arrays ou usar o construtor Array.new.
[[1, 2], [3, 4]] # => [[1, 2], [3, 4]]
numbers = Array(Array(Int32)).new() # => []
numbers << [1, 2] # => [[1, 2]]
Para adicionar um elemento a um array, use o operador << (append).
[1, 2, 3] << 4 # => [1, 2, 3, 4]
O tipo do elemento que você quer adicionar precisa ser o mesmo tipo do array. Caso contrário, um erro será lançado.
numbers : Array(Int32 | Float64) = [1, 2, 3]
numbers << 4.0
numbers # => [1, 2, 3, 4.0]
numbers << "5" # => Error: no overload matches 'Array(Int32 | Float64)#<<' with type String
Assim como com String, você pode obter o tamanho de um array usando o método size.
[1, 2, 3].size # => 3
O compilador não consegue inferir o tipo do array ao criar um array vazio.
Por isso, você precisa especificar o tipo do array.
Isso pode ser feito informando o tipo do array, usando a palavra-chave of, ou usando a sintaxe de inicialização de array, que é Array(T).new.
[] of (Int32 | Float64 | String) # => []
Array(Int32 | Float64 | String).new # => []
Assim como com String, você pode acessar elementos de um array usando o operador [] (índice) e passando o índice do elemento que você quer acessar.
Se o índice estiver fora dos limites, um IndexError será lançado.
[1, 2, 3][0] # => 1
[1, 2, 3][3] # => Index out of bounds (IndexError)
Também é possível acessar elementos usando um intervalo.
[1, 2, 3][0..1] # => [1, 2]
Para criar um array a partir de um intervalo, use o método to_a.
Isso pode ser útil quando você quer criar um array de números.
(1..3).to_a # => [1, 2, 3]
Para criar um array a partir de uma string, use o método split.
Isso permite dividir uma string em um array de strings usando um delimitador.
"1,2,3".split(",") # => ["1", "2", "3"]
Também é possível obter um array de caracteres a partir de uma string usando o método chars.
"123".chars # => ['1', '2', '3']
Para converter um array de Char ou String em uma String, você pode usar o método join, que recebe um delimitador como argumento.
['1', '2', '3'].join(".") # => "1.2.3"
Quando você quer remover um elemento do fim de um array, pode usar o método pop, que recebe um argumento opcional indicando quantos elementos remover do fim do array.
O método retorna o elemento que foi removido.
Se o array estiver vazio, um IndexError será lançado.
numbers = [1, 2, 3]
numbers.pop # => 3
numbers # => [1, 2]
empty_numbers = [] of Int32
empty_numbers.pop # => Index out of bounds (IndexError)
Quando você quer remover um elemento de um índice específico de um array, pode usar o método delete_at, que recebe como argumento o índice do elemento a remover.
Se o array estiver vazio, um IndexError será lançado.
numbers = [1, 2, 3]
numbers.delete_at(1) # => 2
numbers # => [1, 3]
empty_numbers = [] of Int32
empty_numbers.delete_at(0) # => Index out of bounds (IndexError)
Quando você quer modificar um elemento de um índice específico de um array, pode usar o operador []= (atribuição por índice), que recebe como argumentos o índice do elemento a modificar e o novo valor.
Se o índice estiver fora dos limites, um IndexError será lançado.
numbers = [1, 2, 3]
numbers[1] = 4
numbers # => [1, 4, 3]
numbers[3] = 5 # => Index out of bounds (IndexError)
Neste exercício, você precisa implementar alguns métodos para manipular um array de linguagens de programação.
Defina o método LanguageList.list, que não recebe argumentos e retorna um array vazio do tipo Array(String).
LanguageList.list()
# => []
Defina o método LanguageList.add, que recebe 2 argumentos (um array de linguagens e um literal de string de uma linguagem).
O método deve retornar o array com a nova linguagem adicionada ao final.
language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
Defina o método LanguageList.remove, que recebe 1 argumento (um array de linguagens).
O método deve retornar o array sem o último item.
Considere que o array sempre terá pelo menos um item.
language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
language_list = LanguageList.remove(language_list)
# => ["Crystal"]
Defina a função LanguageList.at, que recebe 2 argumentos (um array de linguagens e um índice).
O método deve retornar a linguagem no índice n do array.
Considere que sempre haverá uma linguagem no índice.
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
LanguageList.at(language_list, 1)
# => "Ruby"
Defina o método LanguageList.parse, que recebe 1 argumento (um literal de string de linguagens separadas por vírgula).
O método deve retornar um array de linguagens.
LanguageList.parse("Crystal, Ruby")
# => ["Crystal", "Ruby"]
Crie sua conta no Exercism para aprender e dominar Crystal com 26 conceitos142 exercícios e mentoria humana de verdade, tudo de graça.