一直在努力学习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: ...
似乎是首选,但它对运营商优先级不敏感吗?
答案 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