Macros 为什么/如何/何时在Phoenix Controller/View/etc中使用_using _____;(哪个)宏? 上下文

Macros 为什么/如何/何时在Phoenix Controller/View/etc中使用_using _____;(哪个)宏? 上下文,macros,phoenix-framework,elixir,Macros,Phoenix Framework,Elixir,在每个Phoenix(Elixir Web Framework)应用程序中,位于/lib/{yourapp}\u Web.ex文件的底部 例如: 有一个使用宏的\uuuu,宏定义为: @doc """ When used, dispatch to the appropriate controller/view/etc. """ defmacro __using__(which) when is_atom(which) do apply(__MODULE__, which, []) end

在每个Phoenix(Elixir Web Framework)应用程序中,位于
/lib/{yourapp}\u Web.ex
文件的底部 例如: 有一个使用宏的
\uuuu,宏定义为:

@doc """
When used, dispatch to the appropriate controller/view/etc.
"""
defmacro __using__(which) when is_atom(which) do
  apply(__MODULE__, which, [])
end
问题:使用的
\u\u\u/1
宏用于什么? 如果可以,请分享(或链接到)一个使用示例,这将有助于在现实世界中演示它

如果在
/lib/{yourapp}\u web.ex
文件中没有“导入”,那么
apply
函数从何而来,以及“apply”的作用是什么

我们尝试过谷歌搜索和阅读一些关于宏的文档、教程、博客文章等。e、 g:

但是仍然没有进一步了解为什么/何时/如何使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu-(

如果我们试图从
lib/chat\u web.ex
中注释掉或删除它,即使没有从
chat\u web.ex
调用它,应用程序也不会编译,
excoveralls
(测试覆盖率报告)报告它没有被执行

我发现这种令人困惑的/非初学者友好的方式,搜索《凤凰城指南》(docs)并不是特别有见地,例如:

进一步背景: 在Phoenix聊天示例/教程中:
我们将跟踪测试覆盖率作为学习练习…
只有一行代码未被测试覆盖:

当我们运行测试时,该行如何没有被执行(“覆盖”),但如果我们注释掉该行,测试将失败

这个宏“神奇”是因为它被“使用”而没有被实际调用吗?
非常感谢您的任何见解!

仅供参考:最好的来源是Elixir文档,而不是指南、教程和博客文章。让我引用以下摘录:

打电话时:

use MyModule, some: :options
调用
MyModule
模块中的
\uuuuuuuuu using\uuuu/1
宏时,将传递第二个参数作为其参数。由于
\uuuu using\uuuuuu/1
是一个宏,所有常用的宏规则都适用,其返回值应引用代码,然后插入调用
use/2
的位置

这里也有一些例子,可以澄清这个概念本身


当我们运行测试时,该行如何没有被执行(“覆盖”),但如果我们注释掉该行,测试将失败

由于它是一个宏,因此在编译阶段将其注入调用源代码。也就是说,当调用
使用此模块时,
\uuuuuuuuuuuuuuuu1
返回的AST将被注入调用方的上下文中


我不知道为什么覆盖率如此愚蠢地标记这一行。

最近我遇到了同样的事情,我搜索了一下,但找不到答案。但后来我在我的项目中实现了它,这是有意义的。让我给你一个使用它的例子。我有一些测试用例,它们使用宏编写了相同的控制器。所以它不适合于我会为每个控制器编写类似的测试用例。因此我使用宏
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu1
。并将该宏包含在每个控制器测试中。它解决了我反复为每个测试控制器编写相同代码的问题。一个关于宏覆盖率问题的线程