Array é uma estrutura de dados mutável que guarda uma coleção de elementos de um tipo específico. Um array é uma estrutura de dados indexável. O facto de os arrays serem mutáveis significa que, se chamares a um array um método que o modifica, o array é modificado. Ou seja, não é criado um novo array, mas sim modificado o array existente.
Para criar um array, usa a sintaxe literal de representação de arrays ([]) e, dentro dela, indica os elementos do array separados por vírgulas.
[1, 2, 3] # => [1, 2, 3]
Crystal infere o tipo do array a partir dos elementos.
[1, 2, 3].class # => Array(Int32)
Apesar de termos dito antes que os arrays são uma coleção de elementos de um tipo específico, podes criar um array com vários tipos usando tipos de união. Isto permite que o array contenha elementos de qualquer um dos tipos especificados no tipo de uniã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.
Isto significa que cada elemento do array é, ele próprio, um array.
Isto pode ser útil quando queres guardar dados em formato de tabela.
Para definir um array multidimensional, podes 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 acrescentar um elemento a um array, usa o operador << (acrescentar).
[1, 2, 3] << 4 # => [1, 2, 3, 4]
O tipo do elemento que queres acrescentar tem de ser igual ao tipo do array; caso contrário, é lançado um erro.
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
Tal como com String, podes obter o tamanho de um array com o método size.
[1, 2, 3].size # => 3
O compilador não consegue inferir o tipo do array quando crias um array vazio.
Por isso, tens de especificar o tipo do array.
Podes fazê-lo especificando o tipo do array com 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 # => []
Tal como com String, podes aceder aos elementos de um array com o operador [] (índice), passando-lhe o índice do elemento a que queres aceder.
Se o índice estiver fora dos limites, é lançado um IndexError.
[1, 2, 3][0] # => 1
[1, 2, 3][3] # => Index out of bounds (IndexError)
Também é possível aceder a elementos usando um intervalo.
[1, 2, 3][0..1] # => [1, 2]
Para criar um array a partir de um intervalo, usa o método to_a.
Isto pode ser útil quando queres criar um array de números.
(1..3).to_a # => [1, 2, 3]
Para criar um array a partir de uma string, usa o método split.
Isto permite-te dividir uma string num array de strings usando um delimitador.
"1,2,3".split(",") # => ["1", "2", "3"]
Também é possível obter um array de carateres a partir de uma string com o método chars.
"123".chars # => ['1', '2', '3']
Para converter um array de Char ou String num String, podes usar o método join, que recebe um delimitador como argumento.
['1', '2', '3'].join(".") # => "1.2.3"
Quando queres eliminar um elemento do fim de um array, podes usar o método pop, que recebe um argumento opcional que indica quantos elementos remover do fim do array.
O método devolve o elemento que foi removido.
Se o array estiver vazio, é lançado um IndexError.
numbers = [1, 2, 3]
numbers.pop # => 3
numbers # => [1, 2]
empty_numbers = [] of Int32
empty_numbers.pop # => Index out of bounds (IndexError)
Quando queres eliminar um elemento de um índice específico de um array, podes usar o método delete_at, que recebe como argumento o índice do elemento a remover.
Se o array estiver vazio, é lançado um IndexError.
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 queres modificar um elemento de um índice específico de um array, podes 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, é lançado um IndexError.
numbers = [1, 2, 3]
numbers[1] = 4
numbers # => [1, 4, 3]
numbers[3] = 5 # => Index out of bounds (IndexError)
Neste exercício tens de implementar alguns métodos para manipular um array de linguagens de programação.
Define o método LanguageList.list, que não recebe argumentos e devolve um array vazio do tipo Array(String).
LanguageList.list()
# => []
Define 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 devolver o array com a nova linguagem adicionada ao fim do array.
language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
Define o método LanguageList.remove, que recebe 1 argumento (um array de linguagens).
O método deve devolver o array sem o último elemento.
Assume que o array terá sempre pelo menos um elemento.
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"]
Define a função LanguageList.at, que recebe 2 argumentos (um array de linguagens e um índice).
O método deve devolver a linguagem no índice n do array.
Assume que haverá sempre 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"
Define o método LanguageList.parse, que recebe 1 argumento (um literal de string de linguagens separadas por vírgulas).
O método deve devolver um array de linguagens.
LanguageList.parse("Crystal, Ruby")
# => ["Crystal", "Ruby"]
Inscreve-te no Exercism para aprenderes e dominares Crystal com 26 conceitos142 exercícios, e mentoria humana real, tudo grátis.