сопоставление с образцом в формальном параметре определения функции - PullRequest
3 голосов
/ 01 ноября 2009

Вот кое-что, что я видел в erlang-коде несколько раз, но это сложно для Google, и я могу найти только этот пример (первый блок кода в ссылке ниже):

http://www.process -one.net / о / вики / ejabberd_HTTP_request_handlers /

В «голове» функции определения процесса / 2

process(_LocalPath = ["world"], _Request) ->

есть совпадение с шаблоном по первому параметру / аргументу;

Действует ли это подобно защитному устройству, поэтому следующее предложение будет выполнено только в том случае, если первый аргумент, передаваемый процессу / 2, является строкой "world" или это "world" в качестве аргумента по умолчанию? Или я совершенно не понял / не угадал?

Ответы [ 3 ]

4 голосов
/ 01 ноября 2009

Да, это совпадение с шаблоном. Предложение будет выполнено, если первый аргумент является списком с одним элементом, который является строкой "world".

2 голосов
/ 05 ноября 2009

= в шаблоне используется для псевдонима, он в основном позволяет вам иметь свой торт и есть его. Он выполняет сопоставление с обычным шаблоном и привязывает переменную ко всем сопоставленным данным. Это практично, если вам нужны все данные, так как это избавляет вас от необходимости восстанавливать их. Вы можете использовать его в любом месте шаблона. Это не имеет ничего общего с охраной.

Запуск переменной с _, как в _LocalPath, также говорит компилятору, чтобы он не жаловался, если эта переменная не используется. Обычно компилятор немного скулит, если вы связываете переменные и не используете их. Кроме этого, нет ничего особенного в переменных, имена которых начинаются с _, вы можете использовать их так же, как и любую переменную.

Единственная действительно специальная переменная - _, анонимная переменная. Он всегда совпадает и никогда не связывается, поэтому вы можете использовать его в качестве анонимного заполнителя. Вот почему он существует в первую очередь.

Лично я очень редко использую переменные, начинающиеся с _, и предпочитаю использовать просто _. Я также чувствую, что засорение шаблонов ненужными вещами - это плохая вещь, поэтому я не буду использовать псевдонимы для подобной документации. Я бы написал:

%% process(LocalPath, Request) -> ... .

process(["world"], _) ->

или, возможно, объявление типа, если вы предпочитаете. Думаю, код будет короче и понятнее.

2 голосов
/ 01 ноября 2009

Вы правы: _LocalPath = ["world"] действует как паттерн "сторож". Если первый параметр функции «process» не равен [«world»], то эмулятор переходит к поиску соответствия вниз.

Стоит отметить: _LocalPath служит «декоратором» для улучшения читабельности, поскольку идентификатор начинается с подчеркивания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...