2016-09-18 220 views
0

我有這樣一段簡單的代碼,在大多數語言中會非常簡單。我真的很難看到如何做到這一點。我如何將它轉換成Elixir而不會收到可怕的變量不安全警告?Elixir:嵌套如果聲明

dc = 1 
sd = 5 
sdi = 6 
calc = 1 
bc = 1 
dd = 10 

if (dc == 1) 
    csd = sd 
    bd = sd 
    p = sdi 

    if (calc == 1 && bc != 1) do 
     count = 1 
    else 
     count = 20 
    end  

else 
    csd = dd 
    bd = dd 
    p = dd 

    count = 1 
end 
+0

它適合我。只要在第一個if後面添加一個'do':'if if(dc == 1)do' – tompave

回答

4

此外,通過@Dogbert答案是完全有效,我會模式一路去匹配:

{csd, bd, p, count} = case {dc, calc, bc} do 
{1, 1, 1} -> {sd, sd, sdi, 20} 
{1, 1, _} -> {sd, sd, sdi, 1} 
{1, _, _} -> {sd, sd, sdi, 20} 
{_, _, _} -> {dd, dd, dd, 1} 
end 

在我看來,這是更簡單(加上我討厭在函數式語言使用if。)

+0

謝謝。我喜歡你的答案,而且效果很好。這是一個非常聰明的解決方案,非常緊湊。恕我直言,我不認爲它是像上面的代碼原始嵌套可讀。我一定會變老。 :-( – iphaaw

+0

老實說,我從來沒有讀過'if's,特別是嵌套'if's :)我認爲這是一個習慣問題。順便說一句,我42歲。 – mudasobwa

3

您可以使用元組和模式匹配:

dc = 1 
sd = 5 
sdi = 6 
calc = 1 
bc = 1 
dd = 10 

{csd, bd, p, count} = if dc == 1 do 
    {sd, sd, sdi, if(calc == 1 && bc != 1, do: 1, else: 20)} 
else 
    {dd, dd, dd, 1} 
end 

IO.inspect {csd, bd, p, count} 

輸出:

{5, 5, 6, 20} 

我也要提取if到一個單獨的變量如果它變得太長時間穿上與他人單行:

new_count = if(calc == 1 && bc != 1, do: 1, else: 20) 
{sd, sd, sdi, new_count} 
+0

你不討厭'如果'因爲我討厭'他們'嗎? :)請看我的答案。 – mudasobwa

+0

@mudasobwa up,很好!我想盡一點小小的修改來說明如何消除這些警告,但我很可能在我的項目中使用類似你的解決方案(儘管在這種情況下,它似乎導致大量重複'{sd,sd,sdi'所以在這種情況下我可能會堅持'如果')。 – Dogbert

+0

可能會刪除前兩個子句,並在第三個子句中使用'if',如:{{1,_,_} - > {sd,sd,sdi,if(calc == 1 && bc!= 1,do:1 ,否則:20)}',它比嵌套的'if'更加習慣。 – mudasobwa