为什么我需要`require`一个已经编译和加载的模块?

时间:2016-02-26 14:28:19

标签: elixir

根据h require中的iexrequire"需要编译和加载给定模块",并且需要"如果你想要使用模块中的宏"。

然而,即使编译和加载模块 ,我仍然需要调用require来调用它的宏。例如:

# "require" the file in the sense of "go compile it right now"
# Without doing this (or something equivilent, like `elixir -r macro_module.ex`),
# a call to `require MacroModule` will fail with CompileError: "module MacroModule
# is not loaded and could not be found"
Code.require_file("path/to/macro_module.ex")

defmodule MyModule1 do
  require MacroModule
  MacroModule.some_macro # works
end

defmodule MyModule2 do
  # fails with CompileError: "you must require MacroModule before invoking the
  # macro MacroModule.some_macro/0"
  MacroModule.some_macro
end

require MacroModule中成功使用MyModule2时,为什么我需要在MyModule1require清楚地表明它已被编译和加载?

(我看到文档说MacroModule.some_macro是词法范围的,但在这种情况下,我真的不明白,因为我使用了像import MacroModule; some_macro这样的全局引用而不是像/etc/这样的本地人。)

1 个答案:

答案 0 :(得分:3)

This page解释了 require 的范围规则。基本上,require语句仅在调用它的do块的范围内有效。因此,它是这样的:

defmodule MyModule1 do
  require MacroModule #require now in scope
  MacroModule.some_macro 
end #require goes out of scope