如何在 Julia 中正确加载模块?

How to properly load a module in Julia?

我已经阅读了很多 Julia 文档(0.4 版),但在加载 Julia 文件时仍然遇到问题。这看起来应该很容易。那么,简单明了,我们应该如何在当前代码中直接使用来自其他文件的 Julia 代码?而且,作为一个相关的、有用的奖励,是否有任何历史或语言设计决策可以理解并阐明这种情况?

P.S。我正在使用 0.4.


如果您想了解具体问题,这里是我正在处理的一些事情:

第一个

使用REPL,我想使用我在不同文件中编写的一些功能。据说,我应该能够像这样加载所述文件:

julia> using Foobar

无论我做什么,这只会给我 ArgumentErrors。在尝试使用它之前,我已经尝试包含它:

julia> include("Foobar.jl")
julia> using Foobar

我也试过在尝试使用它之前更新加载路径:

julia> push!(LOAD_PATH, "/Users/me/julia")
julia> using Foobar

第二个

当我尝试通过在使用前包含该文件来修复第一个问题时,我收到任何包含以下内容的行的错误:using ...。消息是在路径中找不到模块。或者换句话说,我试图在当前工作目录中加载一个模块,该模块依赖于当前工作目录中的另一个模块。当我包含要加载的文件时,它会尝试找到依赖项但找不到。

第三

我试过相对路径。 IE。我在与 .jl 文件相同的目录中并执行:

julia> using .Foobar

如果您使用 include("/path/to/myscript.jl"),那么您应该可以访问您使用 include() 调用的文件中定义的任何函数、对象等。不需要额外调用 using

这里有一个答案,提供了有关创建整个包(而不是像上面示例中的单个脚本)的详细信息、如何创建它们以及 using 术语如何影响它们的更多信息: 。例如,包必须安装在相对于其他 julia 文件的特定路径中,而不仅仅是安装在脚本所在的任意工作目录中。

另请参阅 here 以获取有关包的更长教程。

这里似乎工作得很好:

julia> push!(LOAD_PATH, "/Users/me/julia")
2-element Array{ByteString,1}:
 "/Applications/Julia-0.4.5.app/Contents/Resources/julia/local/share/julia/site/v0.4"
 "/Users/me/julia"

julia> readdir(LOAD_PATH[end])
1-element Array{ByteString,1}:
 "MyModule.jl"

julia> using MyModule

julia> x
"Hi there"

其中 MyModule.jl 包含:

module MyModule
  export x
  x = "Hi there"
end