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

问题描述 投票:0回答:3

有没有更短的写法:

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

对于 200 或 404,它返回 true,对于其他所有值,返回 false。最好用 OR 条件来编写它,但这会导致错误:

case testvalue do
  200 || 400 ->
    true
  _ ->
    false
end
elixir
3个回答
84
投票

模式中间的

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

两者的运行速度相同,因为

in
内部守卫转换为比较+
or
,如文档中所述。


6
投票

根据我的经验,

elixir
处理具有函数/模式匹配的情况更有意义,当您的代码库增长时,它的可读性更强。

我会做类似的事情:

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

我同意现在确实没有意义,但将来你会更快乐:)


4
投票

对于这种具体情况,也许返回以下内容是最好的?

testvalue in [200, 400]

例如:

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

它将按预期评估为

true
false

另一种可能性是使用

cond
:

cond do
  testvalue in [200, 400] ->
    true
  true ->
    false
end
© www.soinside.com 2019 - 2024. All rights reserved.