Όταν γράφουμε συναρτήσεις σε Elixir, μπορούμε να αξιοποιήσουμε ένα επιβεβαιωτικό ύφος με αντιστοίχιση προτύπων:
def read_file() do
{:ok, contents} = File.read("hello.txt")
contents
end
Η αντιστοίχιση προτύπων γίνεται ρητά με τον τελεστή αντιστοίχισης, =/2.
Οι αντιστοιχίσεις πετυχαίνουν όταν το σχήμα των δεδομένων στην αριστερή πλευρά του τελεστή ταιριάζει με τη δεξιά πλευρά.
Όταν οι αντιστοιχίσεις πετυχαίνουν, οι μεταβλητές στα αριστερά δεσμεύονται με τις τιμές στα δεξιά.
Η χρήση μιας κάτω παύλας, _, μας επιτρέπει να αγνοήσουμε τις τιμές σε εκείνα τα σημεία.
{:ok, number, _} = {:ok, 5, [4.5, 6.3]}
number
# => 5 is bound to this variable
Ο τελεστής καρφίτσας ^ μπορεί να χρησιμοποιηθεί για να αποτρέψει τη νέα δέσμευση μιας μεταβλητής και αντ' αυτού να κάνει αντιστοίχιση προτύπων με την υπάρχουσα τιμή της.
number = 10
{:ok, ^number, _} = {:ok, 5, [4.5, 6.3]}
# => ** (MatchError) no match of right hand side value: {:ok, 5, [4.5, 6.3]}
Οι αντιστοιχίσεις προτύπων μπορούν επίσης να εμφανίζονται στην κεφαλή μιας ρήτρας συνάρτησης, έτσι ώστε μόνο τα ορίσματα που ταιριάζουν με το πρότυπο να καλούν τη συνάρτηση.
Οι μεταβλητές μπορούν να δεσμευτούν σε μια αντιστοίχιση προτύπων μέσα σε ρήτρα συνάρτησης.
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