根據iex
h require
,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
)。
我使用的藥劑1.2.1 –
我也不懂「未加載**,無法找到**」的字樣。在它說「無法找到」之前它看起來在哪裏? 'require'不會像在Ruby中那樣去搜索加載路徑中的文件。 –