2016-06-23 20 views
1

一直在學習Elixir,我對單線if/else的不同方式有點好奇。爲什麼在Elixir中使用do/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_winner

但我可以使用內聯做/其它/結束塊,做...

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: ...似乎是首選,但它不是更加敏感的運營商優先?

回答

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) 

的風格指南建議總是開始與「原始值」管道鏈,使棉短絨會罵你。最安全的辦法是分配,如果表達的結果,這使得管道無用:

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

或採取如果表達到它自己的功能:

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 
+0

大討論,謝謝!是否有任何選擇比其他選擇更皺眉?還是他們通常都被接受爲「Elixirish」並用於不同的情況?無論如何,「...總是開始具有原始價值的管道鏈......」和「......如果表達成自己的功能」是**很棒的建議。 – kevlarr

+0

他們都是Elixirish。我看到有人爭辯說,如果只有一個表達式在做,而不是它應該使用',do:else:'並且在有多個表達式的情況下離開'do else end'。但是,即使在單一表達式的情況下,我也只是檢查看起來更好看。如果一行中的所有內容少於80個字符,我使用',do:else:'否則'do else end'。查看Credo linter https://github.com/rrrene/credo它檢查你的代碼是否有這樣的東西:)這是一個很酷的學習工具! – tkowal

2

其實語法:

if condition do 
# something 
else 
# something else 
end 

被翻譯成if condition, do: , else:

使用第一個選項是更具可讀性和它更Ruby的語法。使用第二個選項可以爲您節省一些不必要的代碼行,但技術上完全相同。 關於運算符優先級 - 規則是相同的。關於管道操作員 - 總是在表達式周圍使用括號。

+0

」 ......始終在用括號表達式「我喜歡這個,好想! – kevlarr

相關問題