【发布时间】:2018-05-01 22:44:57
【问题描述】:
上下文
在每个 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宏是什么?
如果可以,分享(或链接到)一个使用示例,这将有助于在现实世界上下文中演示它。 p>
apply 函数在/lib/{yourapp}_web.ex 文件中没有“导入”,而“应用”的效果又是什么?
我们已尝试在 Google 上搜索并阅读有关宏的多个文档、教程、博客文章等。例如:
- https://elixir-lang.org/getting-started/meta/macros.html
- https://elixirschool.com/en/lessons/advanced/metaprogramming/
- https://hackernoon.com/understanding-elixir-macros-3464e141434c
- https://medium.com/@Mike_Andr/understanding-elixirs-macros-by-phoenix-example-e99827a60987
但仍然没有更接近理解我们为什么/何时/如何使用__using__/1 宏... :-(
如果我们试图从lib/chat_web.ex 注释掉或删除它,即使它没有被chat_web.ex ...和excoveralls调用(测试覆盖率报告),应用程序也不会编译) 报告它没有被执行。
我发现这令人困惑/不适合初学者,并且搜索 Phoenix 指南(文档)并不是特别有洞察力,例如: 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”吗,因为它被“使用”而实际上没有被调用? 任何shoshininsight 非常感谢!
【问题讨论】:
-
最近我遇到了同样的事情,我搜索但找不到答案。但后来我在我的项目中实现了它,这是有道理的。让我举个例子,我在哪里使用它。我有使用宏编写的具有相同控制器的测试用例。所以它不适合我为每个控制器编写类似的测试用例。所以我使用了宏
__using__/1。并在每个控制器测试中包含该宏。它解决了我一遍又一遍地为每个测试控制器编写相同代码的问题。
标签: macros phoenix-framework elixir