Загрузка модуля в Джулии

у меня возникли проблемы с загрузкой модуля в 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 в моем модуле дерева, который конфликтует с тем же импортом в основном файле, но я не могу найти обходной путь.

Одним из решений, вероятно, было бы поместить все в один и тот же модуль, но я бы хотел, чтобы все было отдельно.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну, на самом деле вы просто помещаете два модуля в один и тот же модуль. Или, если быть более точным, у вас есть модуль 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.

Спасибо, теперь работает. Просто вопрос вдогонку. какова лучшая практика? создать pkg или импортировать модуль?

Staufenbache 17.03.2022 16:24

Я не совсем понимаю ваш вопрос, модуль в некотором роде является пакетом в Джулии, поэтому, чтобы импортировать модуль, вам сначала нужно его создать. Хорошая инструкция Создание пакетов. В любом случае, если Node и Tree не слишком отличаются друг от друга, я бы посоветовал вам поместить их оба в один и тот же пакет и разработать только один.

Oskar 17.03.2022 20:43

да, это скорее вторая часть, о которой я думал. Должен ли я сохранить одну концепцию = один модуль или сгруппировать вещи вместе. но ты уже отвечаешь! спасибо за вашу помощь

Staufenbache 18.03.2022 18:43

Другие вопросы по теме