为什么/如何/何时在Phoenix Controller / View / etc中使用__using __(哪个)宏?

时间:2018-05-01 22:44:57

标签: macros elixir phoenix-framework elixir-framework

上下文

在每个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”的效果是什么?

  

我们在Macros上尝试使用谷歌搜索和阅读几个文档,教程,博客文章等。例如:

但仍然没有更接近理解为什么/何时/如何使用__using__/1宏...... :-(

如果我们尝试发表评论或从lib/chat_web.ex删除该应用,则该应用无法编译,即使它不是从chat_web.ex <{>}来调用而且{{1} (测试覆盖率报告)报告正在执行。

我发现这个令人困惑/非初学者友好的搜索凤凰指南(docs)并不是特别有见地,例如: 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

当我们运行测试时,如何不执行该行(“覆盖”),但如果我们评论 out 那行失败

这个宏“ magic ”是否正在被“使用”而实际上没有被称为? 任何shoshin洞察很多赞赏!

1 个答案:

答案 0 :(得分:3)

仅供参考:最好的来源是Elixir文档,而不是指南,教程和博客文章。让我引用Kernel.use/2

中的这段摘录
  

致电:

use MyModule, some: :options
     

调用__using__/1模块中的MyModule宏,并传递第二个参数作为参数。由于__using__/1是一个宏,所有常用的宏规则都适用,其返回值应该是引用的代码,然后在调用use/2的地方插入。

还有一些例子可以澄清这个概念。

  

当我们运行测试时,该行是如何执行的(“cover”),但是如果我们注释掉行失败?< / p>

因为它是一个宏,所以它被注入到编译阶段的调用源代码中。也就是说,当调用use ThisModule时,__using__/1 返回的AST将被注入调用者的上下文

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