Почему / Как / Когда использовать макрос __using __ (which) в Phoenix Controller / View / etc? - PullRequest
0 голосов
/ 02 мая 2018

Контекст

Внутри каждого приложения 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 image

Дальнейший контекст:

В Примере / Учебнике Чата Феникса: https://github.com/dwyl/phoenix-chat-example
Мы отслеживаем тестовое покрытие как обучающее упражнение ...
Тесты охватывают только одну строку кода, которая не : https://codecov.io/gh/dwyl/phoenix-chat-example/src/b57cc174d7f1c9aac22947f23170b29d4c303776/lib/chat_web.ex#L65 image

Как получается, что строка не выполняется (" closed "), когда мы запускаем тесты, но если мы прокомментируем out строку, тесты fail

Является ли этот макрос " magic " в том смысле, что он "используется", хотя на самом деле не называется ? Любой шошин понимание много высоко ценится!

1 Ответ

0 голосов
/ 02 мая 2018

К вашему сведению: лучшим источником является документация по Elixir, а не руководства, руководства и посты в блогах. Позвольте мне привести этот отрывок из Kernel.use/2:

При звонке:

use MyModule, some: :options

макрос __using__/1 из модуля MyModule вызывается со вторым аргументом, переданным для использования в качестве аргумента. Поскольку __using__/1 является макросом, применяются все обычные правила макросов, и его возвращаемое значение должно заключаться в код в кавычках, который затем вставляется туда, где вызывается use/2.

Там также есть примеры, которые могут прояснить саму концепцию.


Как получается, что строка не выполняется ( «покрыта» ), когда мы запускаем тесты, но если мы закомментируем строку, тесты fail ?

Поскольку это макрос, он внедряется в исходный код вызова на этапе компиляции . Тем не менее, когда вызывается use ThisModule, AST, возвращенный __using__/1 , вводится в контекст вызывающего .

Я понятия не имею, почему Coverage настолько глуп, чтобы отмечать эту строку.

...