Elixir:如何在案例条件下测试多个值?

时间:2016-08-25 08:04:11

标签: elixir

有没有更短的方式来写这个:

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

对于200或404,它返回true,对于其他一切,它返回false。用OR条件写它会很好,但这会导致错误:

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

3 个答案:

答案 0 :(得分:44)

模式中间没有or的直接语法,但你可以使用后卫:

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

你也可以在警卫中使用or。这也可以,但更详细:

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

docs中所述,两者的运行速度同样快in,内部警卫转换为比较+ or

答案 1 :(得分:4)

根据我的经验,在elixir处理函数/模式匹配的情况更有意义,当代码库增长时,它更具可读性。

我会做那样的事情:

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

我同意它现在没有意义,但将来你会更开心:)

答案 2 :(得分:3)

对于这个特定情况,或许返回以下内容最好?

testvalue in [200, 400]

例如:

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

它会按预期评估为truefalse

另一种可能性是使用cond

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