Quando scriviamo funzioni in Elixir, possiamo usare uno stile assertivo con il pattern matching:
def read_file() do
{:ok, contents} = File.read("hello.txt")
contents
end
Il pattern matching si esegue in modo esplicito con l'operatore di match, =/2.
La corrispondenza riesce quando la forma dei dati sul lato sinistro dell'operatore corrisponde a quella dei dati sul lato destro.
Quando la corrispondenza riesce, le variabili a sinistra vengono legate ai valori a destra.
Usare un underscore, _, ci permette di ignorare i valori in quelle posizioni.
{:ok, number, _} = {:ok, 5, [4.5, 6.3]}
number
# => 5 is bound to this variable
L'operatore pin ^ permette di evitare di rilegare una variabile e di fare invece pattern matching sul suo valore esistente.
number = 10
{:ok, ^number, _} = {:ok, 5, [4.5, 6.3]}
# => ** (MatchError) no match of right hand side value: {:ok, 5, [4.5, 6.3]}
Il pattern matching può avvenire anche nella testa di una clausola di funzione, così che solo gli argomenti che corrispondono al pattern chiamino la funzione.
È possibile legare variabili in un pattern match di una clausola di funzione.
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