2016-09-18 129 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