Elixir:嵌套如果声明
问题描述:
我有这样一段简单的代码,在大多数语言中会非常简单。我真的很难看到如何做到这一点。我如何将它转换成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
答
此外,通过@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
。)
答
您可以使用元组和模式匹配:
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}
它适合我。只要在第一个if后面添加一个'do':'if if(dc == 1)do' – tompave