Синтаксис при сопоставлении с образцом с кортежами (Эликсир) - PullRequest
1 голос
/ 30 мая 2020

Я следую руководству, и есть основная проблема c синтаксиса, в которой я не уверен.

Иногда, когда мы сопоставляем шаблон (например, в аргументах функции), мы используем = и сопоставляем слева направо.

Однако иногда я вижу, что вместо него используется -> из =. Например, этот код:

receive do {:result, filename} -> filename do

Я предполагаю, что это неверно:

receive do {:result, filename} = filename do

Это связано с анонимная функция? Или, может быть, специальный синтаксис для кортежей (которые в основном являются картами?).

Ответы [ 2 ]

3 голосов
/ 30 мая 2020

Это связано с анонимной функцией?

Нет.

Или, может быть, специальный синтаксис для кортежей (которые в основном являются картами?)

Совсем нет :)

= - оператор сопоставления, что означает, что RHO должен соответствовать LHO, в противном случае возникает MatchError.

{:ok, _} = {:ok, 42}
#⇒ {:ok, 42}

{:ok, _} = :error
** (MatchError) no match of right hand side value: :error

-> следует читать как «Если что-то из внешней области, в зависимости от контекста, соответствует LHO, оцените RHO».

case :error do
  {:ok, _} -> :never_reached
  _ -> :we_matched_error_through_match_all_clause
end
#⇒ :we_matched_error_through_match_all_clause

¡NB! Обратите внимание (кредиты на D iego Echeverri за упоминание этого в комментариях), что если ни одно предложение не удалось сопоставить в примере ->, выбрасывается MatchError. Таким образом, = может рассматриваться как точно соответствует этому! и -> как соответствует по крайней мере одному из них и выполняет то, что указано в правой части ->.


Примечание: «Кортежи, которые в основном являются картами», ни в коем случае не являются картами.

1 голос
/ 30 мая 2020

Вот как я об этом думаю. Вы можете использовать сопоставление с образцом для «деконструкции» данных, как в:

 [x|xs] = mylist

Вы получаете объект и просматриваете его структуру, поэтому вы получаете доступ к его компонентам. Вот где используется =.

Для receive и case _ do вы смотрите на «принятие решений» или «поток управления» на основе структуры данных, которыми вы управляете. В вашем примере получения вы планируете вернуть имя файла, если полученное сообщение - «ok».

...