2016-09-17 163 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