在 Julia 中加载模块

Loading Module in Julia

我在 Julia 中加载模块时遇到了一些问题。我必须将无法加载到我的主文件中的模块。

所以我的代码(我正在尝试制作八叉树)如下所示:

module Node
    
    export node, contains, intersect
    
    mutable struct node
        x::Float64
        y::Float64
        z::Float64
        m::Float64 
        node(x,y,z) = new(x,y,z,0)
    end
    
end # module

和我的其他模块:

module Tree
        
    include("Node.jl")
    using .Node
        
    export tree, insert!, subdivide!
        
    mutable struct tree
            
        capacity::Int64
        node::node
        divided::Bool
        
        tree(capacity, node) = new(capacity, node, false)
    end
end

我的问题是当我尝试使用类似的方法将模块导入到我的主文件中时:

include("Node.jl")
using .Node
include("Tree.jl")
using .Tree
    
plop=node(0,0,0)
plip=tree(1,plop)

我收到以下错误:

ERROR: LoadError: MethodError: Cannot `convert` an object of type node to an object of type Main.Tree.Node.node

我理解这是因为我的树模块中的 using .Node 与主文件中的相同导入冲突,但我找不到解决方法。

一个解决方案可能是将所有内容都放在同一个模块中,但我想将它们分开。

好吧,你实际上只是将两个模块放在同一个模块中。或者更准确地说,您有一个模块 Node 和一个带有子模块 Node 的模块 Tree,因此是 Main.Tree.Node.node。发生这种情况是因为您在 Tree 模块中使用了 include("Node.jl")。 include 函数的作用就好像它复制了 Node.jl 文件中的文本并将其粘贴到 Tree.jl 文件中一样。因此,要在 Tree 中使用 Node 模块而不创建子模块,您必须添加它。

因此,我建议您为 NodeTree 模块生成一个包。这是由

完成的
julia> using Pkg
julia> Pkg.generate("Node")
  Generating  project Node:
    Node/Project.toml
    Node/src/Node.jl

然后复制您的 Node.jlTree.jl 文件以替换已创建的文件。 然后你可以看看,它告诉你如何添加本地包。

总而言之,您需要

julia> Pkg.develop(path="/Path/to/Node")
julia> Pkg.develop(path="/Path/to/Tree")

那么你的/Path/to/Tree/src/Tree.jl看起来像

module Tree
    using Node
    [...]
end

然后 运行 您可以输入您的代码

julia> using Node, Tree
julia> plop=node(0,0,0)
node(0.0, 0.0, 0.0, 0.0)
julia> plip=tree(1,plop)
tree(1, node(0.0, 0.0, 0.0, 0.0), false)

请注意,它可能会告诉您 Tree 的依赖项中没有 Node。要解决这个问题,您可能需要查看 Pkg.jl.

的文档