Quand on écrit des fonctions en Elixir, on peut s'appuyer sur un style assertif grâce au filtrage par motif :
def read_file() do
{:ok, contents} = File.read("hello.txt")
contents
end
Le filtrage par motif s'effectue explicitement à l'aide de l'opérateur de correspondance, =/2.
La correspondance réussit quand la forme des données à gauche de l'opérateur correspond à celle des données à droite.
Quand la correspondance réussit, les variables à gauche sont liées aux valeurs de droite.
Utiliser un tiret bas, _, permet d'ignorer les valeurs à ces endroits.
{:ok, number, _} = {:ok, 5, [4.5, 6.3]}
number
# => 5 is bound to this variable
L'opérateur pin ^ permet d'empêcher qu'une variable soit reliée de nouveau et, à la place, de faire correspondre le motif à sa valeur existante.
number = 10
{:ok, ^number, _} = {:ok, 5, [4.5, 6.3]}
# => ** (MatchError) no match of right hand side value: {:ok, 5, [4.5, 6.3]}
Une correspondance de motif peut aussi apparaître dans la tête d'une clause de fonction, de sorte que seuls les arguments qui correspondent au motif appellent la fonction.
Il est possible de lier des variables dans le motif d'une clause de fonction.
defmodule Example do
def named_function(:a = atom_variable) do
{atom_variable, 1}
end
end
Example.named_function(:a)
# => {:a, 1}
# The first function clause matches, so it is invoked
Example.named_function(:b)
# => ** (FunctionClauseError) no function clause matching in Example.named_function/1