根据h require
中的iex
,require
"需要编译和加载给定模块",并且需要"如果你想要使用模块中的宏"。
然而,即使编译和加载模块 ,我仍然需要调用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
时,为什么我需要在MyModule1
内require
清楚地表明它已被编译和加载?
(我看到文档说MacroModule.some_macro
是词法范围的,但在这种情况下,我真的不明白,因为我使用了像import MacroModule; some_macro
这样的全局引用而不是像/etc/
这样的本地人。)
答案 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