Почему / Как / Когда использовать макрос __using __ (which) в Phoenix Controller / View / и т. д.?

Контекст

Внутри каждого приложения 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, и каков эффект «применить»?

We have tried googling and reading several docs, tutorials, blog posts etc. on Macros. e.g:

Но все же не ближе к понимание, почему / когда / как мы будем использовать макрос __using__/1 ... :-(

Если мы попытаемся закомментировать или удалить его из lib/chat_web.ex, приложение не будет компилироваться, даже если это не призванный из chat_web.ex ... и excoveralls (отчет о тестовом покрытии) сообщает, что выполняется нет.

Я считаю, что это сбивает с толку / не подходит для новичков, и поиск в руководстве по Phoenix (документы) не особенно полезен, например: https://github.com/phoenixframework/phoenix/blob/29536f3b86154ab64647643a3eeeb263e33834cd/guides/controllers.mdПочему / Как / Когда использовать макрос __using __ (which) в Phoenix Controller / View / и т. д.?

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

В примере / руководстве Phoenix Chat: https://github.com/dwyl/phoenix-chat-example
Мы отслеживаем охват тестами как упражнение обучение ...
Есть только строка кода один, которая нет покрывается тестами: https://codecov.io/gh/dwyl/phoenix-chat-example/src/b57cc174d7f1c9aac22947f23170b29d4c303776/lib/chat_web.ex#L65Почему / Как / Когда использовать макрос __using __ (which) в Phoenix Controller / View / и т. д.?

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

Является ли этот макрос «магия» тем, что он «используется», но фактически не является называется? Любое понимание шошинмного приветствуется!

Недавно я наткнулся на то же самое и искал, но не нашел ответа. Но потом я реализовал это в своем проекте, и это имеет смысл. Приведу пример, в котором я его использую. У меня есть тестовые примеры, в которых тот же контроллер написан с макросом. поэтому он не подходит для меня. Я пишу аналогичные тестовые примеры для каждого контроллера. Поэтому я использовал макрос __using__/1. и включать этот макрос в каждый тест контроллера. Это решает мою проблему многократного написания одного и того же кода для каждого тестового контроллера.

script 02.05.2018 07:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
445
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

When calling:

use MyModule, some: :options

the __using__/1 macro from the MyModule module is invoked with the second argument passed to use as its argument. Since __using__/1 is a macro, all the usual macro rules apply, and its return value should be quoted code that is then inserted where use/2 is called.

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


How is it that the line is not being executed (“covered”) when we run the tests, but if we comment out the line the tests fail?

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

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

Тема про проблемы с охватом макросов github.com/parroty/excoshops/issues/59

Marius Pop 23.01.2020 13:53

Другие вопросы по теме