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

Я не понимаю, предупреждающее сообщение. Каков наилучший способ сделать это в Эликсире?

Обновление: Как насчет этого состояния?

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} = if true do {a + 1, b + 2} else {a, b} end' –

+0

Где, как я полностью понимаю, что вы говорите, это не Мне очень нравится. Я должен застрять в моих путях более обычных методов программирования. Если у меня возникает сложная математическая проблема, которая должна изменить 40 переменных с несколькими вложенными ifs, тогда я должен определить {a, .., a40} для каждого вложенного оператора if? Это будет сделано для очень уродливого кода. Я уверен, что я должен думать об этой проблеме старомодным и неправильным образом. Благодарю. – iphaaw

3

Предупреждение верно, что вы пытаетесь помешать вам совершить _ возможно опасную вещь. Это очень хорошо объяснено в 1.3 списке изменений Elixir.

Взгляните на Deprecation императивного назначение секции, где объясняется (с примером) здесь:

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

Надежда, что помогает!

+0

Kudos для указания этого. Некоторое время я искал официальное объяснение. – potz

Смежные вопросы