2016-09-17 14 views
2

私はエリクシールにとって非常に新しいので、この単純な問題が私を苦しめています。エリクサー: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 

私は警告メッセージを理解していません。エリクサーでこれをする最善の方法は何ですか?

更新:この条件についてはどうですか?

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

すべてのステートメントで値を返します。 ifに変数を代入する代わりに、if文の値全体を変数に代入することができます。

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

同じif文で2つの値を更新する場合はどうなりますか?すなわちaおよびb。ネストされたifはどうでしょうか? – iphaaw

+1

次に、パターンマッチング '{a、b} =真ならば{a + 1、b + 2} else {a、b} end' –

+0

あなたが言っていることを完全に理解しているところでは、私にはかなりの意味があります。私は、従来のプログラミング技術の私の方法で立ち往生しなければならない。複雑な数学問題を解決するには、いくつかのネストされたifで40個の変数を変更する必要がある場合、すべてのネストされたif文に対して{a、..、a40}を定義する必要がありますか?それはいくつかの非常に醜いコードのために作るつもりです。私はこの問題を昔ながらのやり方で考えなければならないと確信しています。ありがとう。 – iphaaw

3

警告はあなたが_危険なことをしないようにしようとしています。これはElixirの1.3の変更ログで非常によく説明されています。

それはここ(例で)説明されているが不可欠割り当てセクションの廃止を見てみましょう:

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

役に立てば幸い!

+0

これを指摘してください。私はしばらくの間、正式な説明を探していました。 – potz

関連する問題