2016-09-17 164 views
2

我对Elixir非常陌生,这个简单的问题让我发疯。Elixir:在if语句中设置变量

a = 0 
if true do 
    a = 1 + 1 
end 
a = a + 1 

IO.puts (a) 

有趣的是这给正确的值也给出了一个警告:

warning: the variable "a" is unsafe as it has been set inside a case/cond/receive/if/&&/||. Please explicitly return the variable value instead. For example: 

case int do 
    1 -> atom = :one 
    2 -> atom = :two 
end 

should be written as 

atom = 
    case int do 
    1 -> :one 
    2 -> :two 
    end 

Unsafe variable found at: 
    Untitled:5 

3 

我不明白的警告消息。 Elixir的最佳做法是什么?

更新:这种情况呢?

a = 0 
b = 0 
if true do 
    a = 1 + 1 
    b = 2 + 2 
end 
a = a + 1 
b = b + 2 

IO.puts (a) 
IO.puts (b) 

回答

9

在Elixir中,每条语句都返回值。您可以将整个if语句值分配给变量,而不是在if中分配变量。

a = 0 
a = if true do 
     1 + 1 
    else 
     a + 1 
    end 
+0

如果我想在同一个if语句中更新两个值,那么怎么办?即a和b。嵌套ifs呢? – iphaaw

+1

然后你可以使用模式匹配'{a,b} =如果真是{a + 1,b + 2} else {a,b} end' –

+0

当我完全理解你在说什么时,它不会对我有很大的意义。我必须坚持使用更传统的编程技术。如果我有一个复杂的数学问题来解决需要改变几个嵌套ifs的40个变量,那么我必须为每个嵌套if语句定义{a,..,a40}?这将会产生一些非常难看的代码。我确信我必须以一种老式错误的方式来思考这个问题。谢谢。 – iphaaw

3

警告是正确的,试图阻止你做可能危险的事情。在Elixir的1.3更新日志中有很好的解释。

弃用势在必行分配段,其中解释(带有示例)看看这里:

http://elixir-lang.org/blog/2016/06/21/elixir-v1-3-0-released/

希望帮助!

+0

指出这点的荣誉。我正在寻找一段时间的官方解释。 – potz