从 Julia 的本地目录加载模块

Luc*_*uca 5 julia

还有其他与此问题相关的问题,但我认为我尝试了推荐的解决方案,但没有成功。

因此,本着我学习 Julia 的初衷,我尝试在本地创建一个模块。我的模块的文件夹结构如下:

- TrimmedGrassmanAvwerage/
    - src/
        - TrimmedGrassmanAverage.jl
        - Utils/
            - dummy.jl
Run Code Online (Sandbox Code Playgroud)

内容dummy.jl很简单:

function dummy(x)
    x + oneunit(x)
end
Run Code Online (Sandbox Code Playgroud)

同样,其内容TrimmedGrassmanAverage为:

module TrimmedGrassmanAverage

export Utils,
       dummy

include("Utils/dummy.jl")

end
Run Code Online (Sandbox Code Playgroud)

现在,在我的 REPL 中我执行以下操作:

julia> include("TrimmedGrassmanAverage/src/TrimmedGrassmanAverage.jl")
Run Code Online (Sandbox Code Playgroud)

这将返回:

Main.TrimmedGrassmanAverage
Run Code Online (Sandbox Code Playgroud)

现在我这样做:

using TrimmedGrassmanAverage
Run Code Online (Sandbox Code Playgroud)

这会返回错误:

ERROR: ArgumentError: Package TrimmedGrassmanAverage not found in current   path:
- Run `Pkg.add("TrimmedGrassmanAverage")` to install the TrimmedGrassmanAverage package.
Run Code Online (Sandbox Code Playgroud)

我认为执行 `include("...") 会将包放入路径中,julia 应该能够找到它。然而,显然还缺少一些步骤。

编辑

但是,我可以这样做:

using Main.TrimmedGrassmanAverage
Run Code Online (Sandbox Code Playgroud)

然后我可以打电话:

TrimmedGrassmanAverage.dummy(10);
Run Code Online (Sandbox Code Playgroud)

我不确定为什么Main必须添加命名空间,也不知道为什么我不能在dummy没有Trimmed...导出dummy函数的情况下直接调用。

Bog*_*ski 4

如何加载模块。使用以下任一方法:

using Main.TrimmedGrassmanAverage
Run Code Online (Sandbox Code Playgroud)

或者

using .TrimmedGrassmanAverage
Run Code Online (Sandbox Code Playgroud)

这将具有相同的效果。原因是当您运行include模块时,它会在Main模块范围内定义。using Something确实会查找包(并且您仅在文件中定义了模块)。LOAD_PATH包查找由和变量控制DEPOT_PATH(请参阅https://docs.julialang.org/en/latest/stdlib/Pkg/#Glossary-1)。

编辑:实际上似乎dummy在 Julia 1.0 上正确导出

julia> module TrimmedGrassmanAverage

export Utils,
       dummy

function dummy(x)
    x + oneunit(x)
end
end
Main.TrimmedGrassmanAverage

julia> using Main.TrimmedGrassmanAverage

julia> dummy(10)
11
Run Code Online (Sandbox Code Playgroud)

至少在我的朱莉娅身上是这样。

对代码的旁注是,Utils模块中未定义该代码,并且您尝试将其导出(请注意,在 Julia 中,从何处获取文件并不重要include- 此函数的工作方式类似于代码的复制粘贴)。