我正在经历SašaJurić的精彩series on macros,在运行以下代码时,我遇到了一些令我困惑的事情:
do_match/3
我的问题是:
哪个模块注入了Plug.Router
函数?是在MyRouter
模块中,还是在use
模块中?在文章的下面,提到require
和import
将代码注入调用者的模块中。这对Macro.to_string/3
ed宏也有效吗?
在Elixir的代码中我应该寻找这种行为的实现吗?
有一种简单的方法可以在扩展后检查模块的结构吗?相当于Module
的东西,但是对于{{1}} s?
答案 0 :(得分:1)
宏生成的函数将在MyRouter
如果你require
一个模块,它的宏将可供调用者模块使用。如果您import
模块,则可以访问其宏和函数,而无需使用模块名称作为前缀。有关详细信息,请参阅getting started guide on alias, require and import。
require
和import
是Elixir的相当低级别的功能,因此它们直接在Erlang中实现。可以找到相当数量的import
和require
逻辑here。
我不知道对这些事情进行反省的方法,因为宏基本上不会在编译的代码中留下任何痕迹。它是宏的美妙之处,它们不会为您的代码带来任何额外的开销。但是,您可以使用MyRouter.__info__(:functions)