Listen sind ein grundlegender Datentyp in Elixir, um eine Sammlung von Werten zu speichern. Listen sind unveränderlich, das heißt, sie können nicht geändert werden. Jede Operation, die eine Liste verändert, gibt eine neue Liste zurück. Listen implementieren das Enumerable-Protokoll, wodurch du Funktionen aus den Modulen Enum und Stream verwenden kannst.
Listen in Elixir sind als verkettete Listen implementiert und nicht als Arrays aneinandergrenzender Speicherstellen. Deshalb dauert der Zugriff auf ein Element einer Liste linear zur Länge der Liste.
Listen kannst du in wörtlicher Schreibweise, in Kopf-Schwanz-Notation (die den cons-Operator | verwendet) oder in einer Kombination aus beidem schreiben:
# 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]]
Es können auch mehr als ein Element vor dem cons-Operator (|) stehen.
# Multiple prepends
[1, 2, 3 | [4, 5]]
Mit der Kopf-Schwanz-Notation kannst du Elemente an eine Liste anhängen.
list = [2, 1]
[3, 2, 1] == [3 | list]
# => true
Elemente während einer Iteration an eine Liste anzuhängen gilt als Anti-Pattern. Beim Anhängen eines Elements musst du die gesamte Liste durchlaufen und das Element am Ende hinzufügen. Würdest du in jeder Iteration ein neues Element anhängen, müsstest du also in jeder Iteration die gesamte Liste durchlaufen.
Dasselbe Ergebnis erreichst du, indem du ein Element vorne an die umgekehrte Liste anfügst und das Ergebnis anschließend umdrehst. Das Voranstellen ist eine schnelle Operation und benötigt konstante Zeit.
# 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!
Es gibt mehrere gängige Kernel-Funktionen für Listen:
hd/1 gibt den Kopf einer Liste zurück, also das erste Element einer Liste.tl/1 gibt den Schwanz der Liste zurück, also die Liste ohne das erste Element.length/1 gibt die Anzahl der Elemente in der Liste zurück.in/2 gibt einen booleschen Wert zurück, der angibt, ob das Element in der Liste enthalten ist.Außerdem gibt es das List-Modul.
Listen können jeden Datentyp und eine Mischung verschiedener Datentypen enthalten.
list = [1, :a, 2.0, "string"]