Elixir的Kernel.SpecialForms.case/2:multi子句" head"执行相同的"身体"

时间:2015-09-15 15:54:38

标签: elixir

我对Elixir中的case语句提出了一个简单的问题(Kernel.SpecialForms.case/2确切地说:GitHubThe awesome pretty doc)。有时,我想要几个子句/模式匹配来执行相同的事情。我总是找到一个带有 guards 的解决方案来伪造它,但我想知道是否可以定义几个模式匹配来执行相同的代码块。

在Ruby中(例如我不在Ruby中使用case,它只是一个插图),你显然可以这样做:

case condition
  when clause1, clause2
    value1
  when clause3
    value3
end

在Elixir中,为了避免这样的事情:

case [a, b] do
 [_, 0] -> a + b
 [_, 1] -> a + b
 [_, 2] -> a + b
 [_, _] -> 10 * b + a
end

我可能会做这样的事情(BTW非常好):

case [a, b] do
 [_, b] when b >= 0 and b <= 2 -> a + b
 [_, _] -> 10 * b + a
end

我要问的是,是否有办法:

case condition
  clause1, clause2 -> puts "do something"
  clause3 -> puts "do something else"
end

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

不,没有办法。 :)您可以将共享代码移动到函数中,并从每个子句体中调用它。

答案 1 :(得分:1)

举一个例子来说明@Jose在说什么:

defmodule Sharedcalls do
    def is_one(a=1,b), do: a_and_b_func
    def is_one(a, b=1), do: a_and_b_func
    def is_one(a, b), do: some_other_func
    defp a_and_b_func, do: IO.puts("a_and_b_func")
    defp some_other_func, do: IO.puts("Neither input is one")
end

Sharedcalls.is_one(1,0)
Sharedcalls.is_one(0,1)
Sharedcalls.is_one(0,0)

万一有人不清楚他的回答是什么意思。我意识到这与你上面的例子并不完全相同,但我认为这对于某人来说已经足够了解。