Я работаю над несколько большим проектом (около 2000 строк), и для лучшей организации кода я хотел разделить свои функции на модули, каждый из которых был в отдельном файле.
Большинство моих функций принимают в качестве аргумента переменную пользовательского типа Typ
, определение которой велико, и я также хотел поместить ее в отдельный файл type.jl
.
Проблема в том, что когда я пытаюсь создать модуль module1
, если я просто делаю include("type.jl")
, модуль создает свою собственную версию кода в type.jl
и создает тип module1.Typ
, и это Тип нельзя использовать в качестве аргумента для функций другого модуля module2
.
Моя идея для решения этой проблемы заключается в определении типа Typ
для Base
, чтобы все модули могли обращаться к одному типу и определять функции над ним. В конце концов я хочу иметь следующую структуру.
В файле type.jl
struct Typ
xs::Array{Int64,1}
ys::Array{Int64,1}
Typ(xs,ys) = new(xs,ys)
end
В файле module1.jl
:
module module1
function func1(x::Typ)
return length(x.xs)
end
end
В файле module2.jl
:
module module2
function func2(x::Typ)
return length(x.ys)
end
end
И возможность запустить все это в файле с именем main.jl
include("type.jl")
include("module1.jl")
include("module2.jl")
b = Typ([0,0],[1,1])
module1.function1(b)
module2.function2(b)
Я пытался использовать Base.include(Base,"type.jl")
до объявления модуля, но он не работает.
Единственное решение, которое я нашел, - не создавать модули, а просто определять функции внутри файлов. Это работает, но для отладки и внесения изменений в будущем я бы предпочел иметь структуру модуля, поскольку она позволяет мне иметь идентификатор для каждой функции, файл которого содержит ее определение.