Wenn wir Funktionen in Elixir schreiben, können wir einen assertiven Stil mit Pattern Matching verwenden:
def read_file() do
{:ok, contents} = File.read("hello.txt")
contents
end
Pattern Matching wird explizit mit dem Match-Operator =/2 durchgeführt.
Ein Match ist erfolgreich, wenn die Form der Daten auf der linken Seite des Operators zur rechten Seite passt.
Wenn ein Match erfolgreich ist, werden die Variablen auf der linken Seite an die Werte auf der rechten Seite gebunden.
Mit einem Unterstrich, _, können wir die Werte an diesen Stellen ignorieren.
{:ok, number, _} = {:ok, 5, [4.5, 6.3]}
number
# => 5 is bound to this variable
Der Pin-Operator ^ kann verwendet werden, um zu verhindern, dass eine Variable neu gebunden wird, und stattdessen gegen ihren vorhandenen Wert zu matchen.
number = 10
{:ok, ^number, _} = {:ok, 5, [4.5, 6.3]}
# => ** (MatchError) no match of right hand side value: {:ok, 5, [4.5, 6.3]}
Pattern Matching kann auch im Kopf einer Funktionsklausel vorkommen, sodass nur Argumente, die zum Muster passen, die Funktion aufrufen.
Variablen können in einem Pattern Match in einer Funktionsklausel gebunden werden.
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