gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:46:28 30 4
gpt4 key购买 nike

根据 iex 中的 h 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

为什么我需要在 MyModule2require MacroModule 而它在 MyModule1 中的成功使用清楚地表明它已被编译和加载?

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

最佳答案

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

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

关于elixir - 为什么我需要 `require` 一个已经编译和加载的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35654285/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com