2016-02-26 113 views
3

根據iexh requirerequire「需要一個給定的模塊進行編譯和裝載」,並需要「如果你想從一個模塊使用宏」。爲什麼我需要'需要'一個已編譯和加載的模塊?

然而,即使模塊編譯和加載,我仍然需要調用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 MacroModuleMyModule2當其在MyModule1的成功應用清楚地表明,它已被編譯並加載?

(我看到文檔說require是詞法範圍的,但我實在不明白,在這種情況下,我使用像MacroModule.some_macro一個全球性的參考,而不是本地一個像import MacroModule; some_macro)。

+0

我使用的藥劑1.2.1 –

+0

我也不懂「未加載**,無法找到**」的字樣。在它說「無法找到」之前它看起來在哪裏? 'require'不會像在Ruby中那樣去搜索加載路徑中的文件。 –

回答

3

This page解釋了作用域規則要求。基本上,require語句只在被調用的do塊的範圍內有效。因此,它會是這樣的:

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

是的,正如我所說的,「要求」是詞彙範圍的。對我來說,令人困惑的是,'MacroModule.some_macro',這不看* *就像一個局部引用,仍然只是在呼籲'要求MyMacro'範圍內有效。但我想這就是它的樣子。 :) –

+0

可能與宏觀衛生有關,但這只是我的猜測。我的意思是它可能與保持宏不會滲入其他模塊有關。 –