在 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
模块而不创建子模块,您必须添加它。
因此,我建议您为 Node
和 Tree
模块生成一个包。这是由
完成的
julia> using Pkg
julia> Pkg.generate("Node")
Generating project Node:
Node/Project.toml
Node/src/Node.jl
然后复制您的 Node.jl
和 Tree.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
.
的文档
我在 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
模块而不创建子模块,您必须添加它。
因此,我建议您为 Node
和 Tree
模块生成一个包。这是由
julia> using Pkg
julia> Pkg.generate("Node")
Generating project Node:
Node/Project.toml
Node/src/Node.jl
然后复制您的 Node.jl
和 Tree.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
.