为什么在Elixir中使用do / else关键字?

时间:2016-06-23 02:21:51

标签: elixir

一直在努力学习Elixir,我对使用if / else做单行的不同方式有点好奇。

我开始......

if left_side_wins?(p, c) do
  {"Humanity", p, c}
else
  {"The Machine", c, p}
end
|> print_winner

...适当地管理元组以获得胜利者。但是这个并没有......

if left_side_wins?(p, c), do: {"Humanity", p, c}, else: {"The Machine", c, p}
|> print_winner

...我知道它因为|>被认为是else的一部分,我可以用括号修复它...... < / p>

if(left_side_wins?(p, c), do: {"Humanity", p, c}, else: {"The Machine", c, p})
|> print_winner

......这现在有效。对于任何一位获胜者,元组都会正确地传送到print_winner

但我可以使用内联的do / else / end块并执行...

if left_side_wins?(p, c) do {"Humanity", p, c} else {"The Machine", c, p} end
|> print_winner

......也可以。

我读过的每个资源都使用do:.., else:..格式进行了描述,但do ... else ... end似乎更清晰,更不容易出错。

除了我所看到的之外,它们之间有哪些主要区别?

do: ..., else: ...似乎是首选,但它对运营商优先级不敏感吗?

2 个答案:

答案 0 :(得分:2)

实际上是语法:

if condition do
# something
else 
# something else
end

已翻译为if condition, do: , else:

使用第一个选项更具可读性,而且更多Ruby的语法。使用第二个选项可以为您节省一些不必要的代码行,但技术上完全相同。 关于运算符优先级 - 规则是相同的。关于管道运算符 - 总是在表达式周围使用括号。

答案 1 :(得分:1)

do: else:不是首选。如果你喜欢它就在那里。它们扩展到相同的东西,但正如您发现的那样,运算符优先级是不同的。 |>并不贪心,因此它试图在其左侧获得最小的表达式:

if condition?, do: true_part, else: false_part |> print_winner

是:

if condition?, do: true_part, else: (false_part |> print_winner)

是:

if condition?, do: true_part, else: print_winner(false_part)

在某些情况下可能是你真正想要的。管道运算符成为else表达式的一部分。如果是if do end语法。

if condition? do true_part else false_part end |> print_winner

它与:

相同
print_winner(if condition? do true_part else false_part end)

风格指南建议始终以“原始价值”开始连锁管道,因此短裤会对你大喊大叫。最安全的方法是分配if表达式的结果,使得管道无用:

winner = if left_side_wins?(p, c), do: {"Humanity", p, c}, else: {"The Machine", c, p}
print_winner(winner)

或将if表达式转换为自己的函数:

def determine_winner({p, c}) do
  if left_side_wins?(p, c), do: {"Humanity", p, c}, else: {"The Machine", c, p}
end

{p, c}
|> determine_winner
|> print_winner