у меня возникли проблемы с загрузкой модуля в 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
и модуль Tree
с подмодулем Node
в нем, таким образом, Main.Tree.Node.node
. Это происходит потому, что вы используете include("Node.jl")
в своем модуле Tree
. Функция включения работает так, как если бы она скопировала текст из файла Node.jl
и вставила его в файл Tree.jl
. Таким образом, чтобы использовать модуль Node
внутри Tree
без создания подмодуля, вы должны добавить его.
Итак, я бы порекомендовал вам создать пакет для модулей 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
.
Я не совсем понимаю ваш вопрос, модуль в некотором роде является пакетом в Джулии, поэтому, чтобы импортировать модуль, вам сначала нужно его создать. Хорошая инструкция Создание пакетов. В любом случае, если Node
и Tree
не слишком отличаются друг от друга, я бы посоветовал вам поместить их оба в один и тот же пакет и разработать только один.
да, это скорее вторая часть, о которой я думал. Должен ли я сохранить одну концепцию = один модуль или сгруппировать вещи вместе. но ты уже отвечаешь! спасибо за вашу помощь
Спасибо, теперь работает. Просто вопрос вдогонку. какова лучшая практика? создать pkg или импортировать модуль?