Gli array sono un tipo di dato di base in Elixir per contenere una raccolta di valori. Gli array sono immutabili, cioè non possono essere modificati. Qualsiasi operazione che modifica un array restituisce un nuovo array. Gli array implementano il protocollo Enumerable, che consente di usare le funzioni dei moduli Enum e Stream.
In Elixir, gli array sono implementati come array concatenati, e non come blocchi di memoria contigui. Di conseguenza, accedere a un elemento di un array richiede un tempo lineare in base alla lunghezza dell'array.
Gli array si possono scrivere in forma letterale, con la notazione testa-coda (che usa l'operatore cons |), oppure con una combinazione delle due:
# Literal Form
[]
[1]
[1, 2, 3]
# Head-tail Notation
[]
# same as [1]
[1 | []]
# same as [1, 2, 3]
[1 | [2 | [3 | []]]]
# Mixed
# same as [1, 2, 3]
[1 | [2, 3]]
Ci può anche essere più di un elemento prima dell'operatore cons (|).
# Multiple prepends
[1, 2, 3 | [4, 5]]
La notazione testa-coda si può usare per aggiungere elementi alla fine di un array.
list = [2, 1]
[3, 2, 1] == [3 | list]
# => true
Aggiungere elementi alla fine di un array durante l'iterazione è considerato un anti-pattern. Aggiungere un elemento richiede di percorrere l'intero array e di inserirlo alla fine; quindi, aggiungere un nuovo elemento a ogni iterazione richiederebbe di percorrere l'intero array a ogni iterazione.
Possiamo ottenere lo stesso risultato aggiungendo un elemento in testa all'array invertito e poi invertendo il risultato. Aggiungere in testa è un'operazione veloce e richiede tempo costante.
# Appending to the end of a list (potentially slow)
[1, 2, 3] ++ [4] ++ [5] ++ [6]
# Prepend to the start of a list (faster, due to the nature of linked lists)
[6 | [5 | [4 | [3, 2, 1]]]]
# then reverse!
Ci sono diverse funzioni comuni del modulo Kernel per gli array:
hd/1 restituisce la testa di un array, cioè il primo elemento dell'array.tl/1 restituisce la coda dell'array, cioè l'array senza il primo elemento.length/1 restituisce il numero di elementi dell'array.in/2 restituisce un valore booleano che indica se l'elemento è presente nell'array.C'è anche il modulo List.
Gli array possono contenere qualsiasi tipo di dato e un misto di tipi di dato diversi.
list = [1, :a, 2.0, "string"]