为什么在Elixir中使用do/else关键字来表示if?

为什么在Elixir中使用do/else关键字来表示if?,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

我一直在学习长生不老药,我有点好奇用不同的方法来做一行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
的一部分,我可以用括号来修复它

if(left_side_wins?(p, c), do: {"Humanity", p, c}, else: {"The Machine", c, p})
|> print_winner
。。。这现在起作用了。对于任何一个获胜者,元组都被正确地输送到
print\u winner

但我也可以使用内联do/else/end块和do

if left_side_wins?(p, c) do {"Humanity", p, c} else {"The Machine", c, p} end
|> print_winner
。。。这同样有效

我读过的每一篇资源都描述了如何使用
do:..,else:..
格式,但是
do。。。其他的结束
看起来既干净又不容易出错

除了我所看到的,他们之间的主要区别是什么

do:…,else:…
似乎是首选,但它对运算符优先级是否更敏感?

实际上语法:

if condition do
# something
else 
# something else
end
转换为形式
if条件,do:,else:

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

并非首选
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)
即:

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)
样式指南建议总是以“原始值”开始管道链,这样Linter会对你大喊大叫。最安全的方法是指定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

非常好的讨论,谢谢!是否有任何一种选择比其他选择更令人不快,或者它们都被普遍认为是“长生不老药”,并在不同的情况下使用?不管怎样,“…始终以原始值启动管道链…”和“…将if表达式纳入其自身功能”都是很好的建议。它们都是长生不老药。我看到有人争辩说,如果do和else中只有一个表达式,而不应该使用
,do:else:
,如果有多个表达式,则离开
do else end
。但就个人而言,即使是在单一表达的情况下,我也只会检查哪些更好看。如果一行中的所有内容少于80个字符,我将使用
,do:else:
否则
do else end
。检查Credo linter它检查您的代码是否有这样的东西:)这是一个很酷的学习工具!“…在表达“我喜欢这样,好主意!”!