例如,assign未在此模块中的任何位置定义。您还可以看到use
s Phoenix.Channel
,但在任何地方都没有定义assign
。结果assign
在Phoenix.Socket中定义,我知道的唯一原因是因为在Phoenix.Socket
中定义了一个名为channel的宏,它使用{{1} }}。显然,不知何故,这会给Phoenix.LiveReload.Channel
Phoenix.LiveReload.Channel
函数。
除了assign
之外,你应该如何追踪那个逻辑?就像,如果我只是看grep
,我怎么知道Phoenix.LiveReload.Channel
来自哪里?
答案 0 :(得分:2)
这是创作者Jose Valim的回应:
Elixir导入和别名是词法,这意味着您未定义的模块中出现的任何内容都必须已在代码中显式导入。因此,寻找使用Mod或导入Mod是从函数的来源找到的方法。 此规则的唯一例外是默认情况下导入的内核模块。