在每个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
凤凰聊天示例/教程:https://github.com/dwyl/phoenix-chat-example
我们正在跟踪测试覆盖率作为学习练习...
测试中只有 一个 代码行不:
https://codecov.io/gh/dwyl/phoenix-chat-example/src/b57cc174d7f1c9aac22947f23170b29d4c303776/lib/chat_web.ex#L65
当我们运行测试时,如何不执行该行(“覆盖”),但如果我们评论 out 那行失败
这个宏“ magic ”是否正在被“使用”而实际上没有被称为? 任何shoshin洞察很多赞赏!
答案 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如此愚蠢地标记这一行。