Каковы точные различия между переменными подчеркивания и именованной переменной, которая начинается с подчеркивания с точки зрения компилятора Erlang (помимо добавления читаемости к коду)?
Например, _
и _Var
разные?
Каковы точные различия между переменными подчеркивания и именованной переменной, которая начинается с подчеркивания с точки зрения компилятора Erlang (помимо добавления читаемости к коду)?
Например, _
и _Var
разные?
Не волнует переменная _
- это переменная ОЧЕНЬ СПЕЦИАЛЬНАЯ, которая соответствует чему-либо, и НИКОГДА не привязана к значению. Он используется, когда я знаю, что есть что-то, но мне все равно, что такое ценность, и я никогда не буду использовать. Если смотреть _
никогда не связано, он не может использоваться в выражении, и компилятор помещает его как ошибку.
Переменные, такие как _Var
, являются совершенно нормальными переменными, которые вы можете сопоставить и будут привязаны к значениям, что означает, что они могут использоваться в выражениях. Префикс переменной с _
- о намерении. Компилятор обычно предупреждает вас о переменной, которая привязана к шаблону, но никогда не используется, часто является признаком ошибки. Но компилятор не предупреждает переменные с префиксом _
, как в _Var
. Цель состоит в том, что я хочу дать переменной имя, именовать вещи хорошо, но я знаю, что никогда не буду использовать его.
Помните, что _
действительно единственная специальная переменная и что _Var
являются нормальными переменными и ведут себя как таковые, если они используются. Если вы чувствуете себя извращенными, вы можете прикрепить все свои переменные _
, и все будет работать.
Обозначьте 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, условие здесь не работает.