Elixir 长生不老药&x27;s Kernel.SpecialForms.case/2:多子句“;标题「;执行相同的命令;正文“;

Elixir 长生不老药&x27;s Kernel.SpecialForms.case/2:多子句“;标题「;执行相同的命令;正文“;,elixir,Elixir,我有一个关于Elixir中的case语句的简单问题(Kernel.SpecialForms.case/2确切地说:,)。有时,我需要几个子句/模式匹配来执行相同的事情。我总是能找到一个有警卫的解决方案来伪造它,但我想知道是否有可能定义几个模式匹配来执行同一个代码块 例如,在Ruby中(我在Ruby中不使用case,它只是一个示例),您显然可以这样做: case condition when clause1, clause2 value1 when clause3 valu

我有一个关于Elixir中的
case
语句的简单问题(
Kernel.SpecialForms.case/2
确切地说:,)。有时,我需要几个子句/模式匹配来执行相同的事情。我总是能找到一个有警卫的解决方案来伪造它,但我想知道是否有可能定义几个模式匹配来执行同一个代码块

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

case condition
  when clause1, clause2
    value1
  when clause3
    value3
end
case [a, b] do
 [_, 0] -> a + b
 [_, 1] -> a + b
 [_, 2] -> a + b
 [_, _] -> 10 * b + a
end
在长生不老药中,为了避免类似的事情:

case condition
  when clause1, clause2
    value1
  when clause3
    value3
end
case [a, b] do
 [_, 0] -> a + b
 [_, 1] -> a + b
 [_, 2] -> a + b
 [_, _] -> 10 * b + a
end
我可能会做这样的事情(顺便说一句,这很好):


谢谢你的帮助

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

仅举一个@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)
以防有人不清楚他在回答中的意思。我意识到这与你上面的例子并不完全相同,但我认为这足以让人理解