Анонимные переменные в Erlang - программирование
Подтвердить что ты не робот

Анонимные переменные в Erlang

Каковы точные различия между переменными подчеркивания и именованной переменной, которая начинается с подчеркивания с точки зрения компилятора Erlang (помимо добавления читаемости к коду)?

Например, _ и _Var разные?

4b9b3361

Ответ 1

Не волнует переменная _ - это переменная ОЧЕНЬ СПЕЦИАЛЬНАЯ, которая соответствует чему-либо, и НИКОГДА не привязана к значению. Он используется, когда я знаю, что есть что-то, но мне все равно, что такое ценность, и я никогда не буду использовать. Если смотреть _ никогда не связано, он не может использоваться в выражении, и компилятор помещает его как ошибку.

Переменные, такие как _Var, являются совершенно нормальными переменными, которые вы можете сопоставить и будут привязаны к значениям, что означает, что они могут использоваться в выражениях. Префикс переменной с _ - о намерении. Компилятор обычно предупреждает вас о переменной, которая привязана к шаблону, но никогда не используется, часто является признаком ошибки. Но компилятор не предупреждает переменные с префиксом _, как в _Var. Цель состоит в том, что я хочу дать переменной имя, именовать вещи хорошо, но я знаю, что никогда не буду использовать его.

Помните, что _ действительно единственная специальная переменная и что _Var являются нормальными переменными и ведут себя как таковые, если они используются. Если вы чувствуете себя извращенными, вы можете прикрепить все свои переменные _, и все будет работать.

Ответ 2

Обозначьте doc здесь:

Анонимная переменная обозначается символом underscore (_) и может использоваться когда требуется переменная, но ее значение можно игнорировать. [...]

Переменные, начинающиеся с символа подчеркивания (_), например _Height, являются нормальными переменными, а не анонимными: однако они игнорируются компилятором в том смысле, что они не будут генерировать никаких предупреждений для неиспользуемых переменных.

Другими словами, вы используете форму _Var, когда вам нужно согласованное выражение, которое должно быть сопоставлено, но не хотите использовать его дальше И/ИЛИ вы хотите показать его значение. И вы используете переменную _, когда ни вы, ни компилятор не должны заботиться о выражении, которое будет соответствовать ему.

Пример 1:

member(_, []) -> [].

В этой функции не совсем понятно, что соответствует первому _. Но переписывая его напрямую, например:

member(Elem, []) -> [].

... генерирует предупреждение, если код скомпилирован с установленным флагом warn_unused_vars. Вы все равно можете сделать код читаемым здесь, однако, используя подчеркнутую переменную:

member(_Elem, []) -> [].

Пример 2:

{_, _, Some} = {1, 2, 3}

Это соответствие кортежа будет идти довольно неплохо, так как первые два элемента кортежа будут полностью проигнорированы.

{_Var, _Var, Some} = {1, 2, 3}

Это совпадение не удастся, однако: хотя _Var не нужно будет использовать, он должен быть "заполнен" одним и тем же значением! Поскольку 1 не равно 2, условие здесь не работает.