Elixir案例在一条线上

Pep*_*ain 9 elixir

我想在一行上有以下案例:

case s do
  :a -> :b
  :b -> :a
end
Run Code Online (Sandbox Code Playgroud)

case被定义为case(condition, clauses).下列

quote do
  case s do
    :a -> :b
    :b -> :a
  end
end
Run Code Online (Sandbox Code Playgroud)

得到:

{:case, [],
 [{:s, [], Elixir}, [do: [{:->, [], [[:a], :b]}, {:->, [], [[:b], :a]}]]]}
Run Code Online (Sandbox Code Playgroud)

从这里应该可以回到 case(s, ???)

mic*_*ala 16

有两种可能的方法可以做到这一点.上面的答案之一是内联do end调用获取:

case s do :a -> :b; :b -> :a end
Run Code Online (Sandbox Code Playgroud)

另一个是使用, do:块的关键字版本.我们需要对这两个表达式进行分组 - 否则编译器不会知道这两个子句都属于这种情况:

case s, do: (:a -> :b; :b -> :a)
Run Code Online (Sandbox Code Playgroud)

如果没有parens,表达式将被解析为:

(case s, do: :a -> :b); :b -> :a
Run Code Online (Sandbox Code Playgroud)

而且:b -> :a它本身并不是灵药中的有效表达.


Fra*_*itt 7

显然,你可以;用来实现你想要的:

 case s do :a -> :b; :b -> :a end
Run Code Online (Sandbox Code Playgroud)