Comment filtrer les paramètres invalides comme nil ou la liste vide avant de procéder au traitement des paramètres?
L'utilisation de case
ci-dessous semble être courante, mais ce n'est pas du code clair - je suis presque sûr qu'il existe un moyen plus simple et idiomatique de le faire.
def load(token) do
case token do
nil -> nil
[] -> nil
token -> process(token)
end
end
Si une fonction a plusieurs clauses, Elixir essaiera chaque clause jusqu'à ce qu'elle en trouve une qui corresponde. Cela vous permet de "filtrer" sur la base des arguments fournis - particulièrement utile si les fonctions ne partagent pas de logique commune.
def load([]), do: IO.puts("empty")
def load(token) when token == nil, do: IO.puts("nil") # Matching `nil' is OK too.
def load(token), do: process(token)
La deuxième clause illustre l'utilisation de gardes qui permettent des correspondances plus générales, il y a n certain nombre de prédicats qui sont valides en tant que gardes qui peuvent tous être attachés à (presque) n'importe quelle expression utilisée pour basculer sur arguments de fonction, récursivement ou non.
Cette convention s'applique à tous les langages BEAM existants et est utile à garder à l'esprit lors de la lecture de la documentation OTP.
Je préfère
def load(nil), do: nil
def load([]), do: nil
def load(token), do: process(token)
Vous pourriez également faire:
def load([]), do: nil
def load(token) when not is_nil(token), do: process(token)
def load(_), do: nil
Mais je ne comparerais pas token == nil
car vous obtiendrez un avertissement du compilateur.