Elixir:嵌套If语句

时间:2016-09-18 20:27:05

标签: elixir nested-if

我有这么简单的代码,在大多数语言中都非常简单。我真的很难看到如何做到这一点。如何在没有得到可怕的变量不安全警告的情况下将其转换为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

2 个答案:

答案 0 :(得分: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。)

答案 1 :(得分: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}