Elixir:嵌套的 If 语句

Elixir: Nested If Statements

我有一段简单的代码,在大多数语言中都非常简单。我真的很难看到如何做到这一点。我如何将其转换为 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

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

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}

@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。)