Macros 为什么/如何/何时在Phoenix Controller/View/etc中使用_using _____;(哪个)宏? 上下文
在每个Phoenix(Elixir Web Framework)应用程序中,位于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
/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
。并将该宏包含在每个控制器测试中。它解决了我反复为每个测试控制器编写相同代码的问题。一个关于宏覆盖率问题的线程