2016-08-10 3 views
1

Это какая-то небольшая ошибка или умышленно, что, когда я присваиваю одно значение переменной более одного раза, она не выдает ошибку, но, например, назначает ее еще раз?Присвоение того же значения дважды в Erlang

Вот пример:

X = 1, 
X = 100 - 99, 
X = 1, 
X = list_to_integer("1"), 
X = X. 

Не должна ли она выдаст ошибку? Выброс ошибки может означать, что некоторая часть кода пытается переназначить переменную, и может быть просто удачей, что она такая же, как и раньше.

ответ

4

На самом деле это не назначение, а операция сопоставления (знак равенства на самом деле является оператором сопряжения). См. http://erlang.org/doc/reference_manual/patterns.html

Что на самом деле происходит, так это то, что вы пытаетесь «сопоставить образец» с левой стороной оператора (=) против того, что находится справа.

Если есть переменная с левой стороны и она еще не ограничена, она будет ограничена значением, которое вы имеете на правой стороне.

С другой стороны, если переменная уже связана и значение совпадает с тем, что находится на правой стороне оператора, ничего не происходит, совпадение просто преуспевает.

Если значения разные, возникает ошибка совпадения шаблонов.

Обратите внимание, что специальная переменная «_» всегда будет иметь успех, если шаблон соответствует любому значению.

Совместимость шаблонов в Erlang действительно полезна, потому что вы можете быстро сработать, когда что-то не так. Например, в этом коде:

{ok, Value} = some_function() 

Если some_function/0 возвращает что-то вроде {ошибка, _} ваш код будет просто крах и вы не рискуете, чтобы продолжить выполнение с недопустимыми значениями.

Если some_function возвращает ожидаемое значение, значение переменной теперь будет ограничено этим результатом, это похоже на присвоение и утверждение в одной строке кода (если вы хотите посмотреть на него таким образом).

Имеет смысл?

+0

Да, это имеет смысл, спасибо. Похоже, что у Erlang нет традиционного механизма назначения переменных, как я привык видеть на других языках. –

+2

Отлично! Обратите внимание, что сопоставление шаблонов имеет много применений в Erlang, которые я оставил вне ответа, потому что вы специально задали вопрос об одном прецеденте, но вы можете использовать сопоставление шаблонов в предложениях функций, try-catch, case и т. Д. Использование сопоставления шаблонов обычно дает ваш код более ясность и отличный способ избежать ошибок ifs и spot в коде. Вы можете прочитать больше в этой замечательной книге http://learnyousomeerlang.com/syntax-in-functions Cheers! – marcelog

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