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