web-dev-qa-db-fra.com

Élixir idiomatique à exécuter si les paramètres ne sont pas nuls?

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
11
Teo Choong Ping

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.

8
ŹV -

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.

4
atomkirk