web-dev-qa-db-fra.com

Elixir: comment tester plusieurs valeurs en condition de cas?

Existe-t-il un moyen plus court d'écrire ceci:

case testvalue do
  200 ->
    true
  404 ->
    true
  _ ->
    false
end

Il renvoie vrai pour 200 ou 404 et faux pour tout le reste. Ce serait bien de l'écrire avec une condition OR mais cela conduit à une erreur:

case testvalue do
  200 || 400 ->
    true
  _ ->
    false
end
20
Ole Spaarmann

Il n'y a pas de syntaxe directe pour or au milieu des modèles mais vous pouvez utiliser un garde:

case testvalue do
  n when n in [200, 400] ->
    true
  _ ->
    false
end

Vous pouvez également utiliser or dans les gardes. Cela fonctionnera aussi mais est plus détaillé:

case testvalue do
  n when n == 200 or n == 400 ->
    true
  _ ->
    false
end

Les deux s'exécuteront aussi rapidement que in à l'intérieur des gardes est converti en comparaisons + or, comme mentionné dans le docs .

48
Dogbert

D'après mon expérience, il est plus logique dans elixir de gérer les cas avec des fonctions/correspondance de modèle, c'est plus lisible lorsque votre base de code grandit.

Je ferais quelque chose comme ça:

defp valid_http_response?(200), do: true
defp valid_http_response?(400), do: true
defp valid_http_response?(_), do: false

Je suis d'accord que cela n'a pas vraiment de sens maintenant, mais à l'avenir, vous serez plus heureux :)

4
Jeremie Ges

Pour ce cas spécifique, il serait peut-être préférable de renvoyer ce qui suit?

testvalue in [200, 400]

Par exemple:

def test_my_value(testvalue), do: testvalue in [200, 400]

Il sera évalué à true ou false comme prévu.

Une autre possibilité serait d'utiliser cond:

cond do
  testvalue in [200, 400] ->
    true
  true ->
    false
end
3
David Sulc