En Elixir, une même fonction peut avoir plusieurs clauses. On y parvient en faisant du pattern matching sur les arguments de la fonction et en utilisant des gardes.
# pattern matching the argument
def number(7) do
"Awesome, that's my favorite"
end
# using a guard
def number(n) when is_integer(n) do
"That's not my favorite"
end
def number(_n) do
"That's not even a number!"
end
FunctionClauseError._, sinon le compilateur émet un avertissement.fn
13 -> "Awesome, that's my favorite"
_ -> "That's not my favorite"
end
Ne confonds pas les fonctions à plusieurs clauses avec la surcharge de fonctions que tu connais peut-être dans d'autres langages de programmation. En Elixir, les fonctions sont identifiées uniquement par leur nom et leur arité, et non par le type de leurs arguments (puisqu'il n'y a pas de typage statique). La fonction number/1 de l'exemple est considérée comme une seule fonction, quel que soit le nombre de clauses qu'elle contient.