2016-08-25 3 views
9

Gibt es einen kürzeren Weg, dies zu schreiben: für alles andereElixier: Wie man mehrere Werte im Fallzustand prüft?

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

Es gibt true zurück, für 200 oder 404 und falsch. Es wäre schön, es mit einer OR-Bedingung zu schreiben, aber dies führt zu einem Fehler:

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

Antwort

26

Es gibt keine direkte Syntax für or in der Mitte von Mustern, aber Sie eine Wache verwenden können:

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

Sie können or auch in Wächtern verwenden. Dies wird auch funktionieren, ist aber ausführlicher:

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

Beide laufen gleich schnell wie in innerhalb Wachen in Vergleiche umgewandelt + or, wie in der docs erwähnt.

1

Für diesen speziellen Fall wäre vielleicht die beste Antwort?

testvalue in [200, 400] 

Zum Beispiel:

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

Es wird true bewerten oder false wie beabsichtigt.

würde Eine andere Möglichkeit cond zu benutzen:

cond do 
    testvalue in [200, 400] -> 
    true 
    true -> 
    false 
end 
+0

'cond' mit' wahr sein -> 'funktioniert nicht wirklich, da ich die Bedingung brauche, um wahr oder falsch zurückzugeben. Wie Sie es geschrieben haben, die letzte Bedingung wird immer übereinstimmen und somit wird das Ergebnis immer falsch sein. –

+2

Die Syntax sieht in diesem Fall etwas verwirrend aus, aber 'true ->' ist im Grunde das Äquivalent einer "else" -Klausel. Siehe http://elixir-lang.org/getting-started/case-cond-and-if.html#cond. Der obige Code liefert also "wahr" oder "falsch". –

4

Aus meiner Erfahrung macht es mehr Sinn in elixir die Fälle mit Funktionen/Pattern-Matching zu handhaben, es ist besser lesbar, wenn die Code-Basis wächst.

Ich würde so etwas tun:

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

Ich stimme es nicht wirklich Sinn, jetzt, aber in der Zukunft werden Sie glücklicher :)