Контекст
Внутри каждого приложения Phoenix (Elixir Web Framework), внизу файла /lib/{yourapp}_web.ex
например: /lib/chat_web.ex
есть макрос __using__/1
, определенный как:
@doc """
When used, dispatch to the appropriate controller/view/etc.
"""
defmacro __using__(which) when is_atom(which) do
apply(__MODULE__, which, [])
end
Вопрос : что за макрос __using__/1
используется для ?
Если можете, поделитесь ( или ссылкой на ) примером использования , который поможет продемонстрировать его в контексте реального мира .
Откуда берется функция apply
, учитывая, что она не "импортирована" в файл /lib/{yourapp}_web.ex
и каков эффект для "apply"?
Мы попытались найти и прочитать несколько документов, учебные пособия, сообщения в блогах и т. Д. На макросах. например:
Но все же не ближе к пониманию почему / когда / как мы будем использовать __using__/1
макрос ... :-(
Если мы попытаемся закомментировать или удалить его из lib/chat_web.ex
, приложение не будет скомпилировано, даже если оно не вызвано из с chat_web.ex
... и excoveralls
(отчет о тестировании покрытия) сообщает, что не выполняется.
Я считаю, что это сбивает с толку / не подходит для новичков, и поиск руководства по Фениксу (документов) не особенно проницателен, например:
https://github.com/phoenixframework/phoenix/blob/29536f3b86154ab64647643a3eeeb263e33834cd/guides/controllers.md
Дальнейший контекст:
В Примере / Учебнике Чата Феникса: https://github.com/dwyl/phoenix-chat-example
Мы отслеживаем тестовое покрытие как обучающее упражнение ...
Тесты охватывают только одну строку кода, которая не :
https://codecov.io/gh/dwyl/phoenix-chat-example/src/b57cc174d7f1c9aac22947f23170b29d4c303776/lib/chat_web.ex#L65
Как получается, что строка не выполняется (" closed "), когда мы запускаем тесты, но если мы прокомментируем out строку, тесты fail
Является ли этот макрос " magic " в том смысле, что он "используется", хотя на самом деле не называется ?
Любой шошин понимание много высоко ценится!